Questions tagged «text-processing»

通过程序,脚本等操作或检查文本

8
如何替换文件中的字符串?
根据某些搜索条件替换文件中的字符串是非常常见的任务。我怎样才能 替换字符串foo用bar在当前目录下的所有文件? 递归子目录是否一样? 仅在文件名匹配另一个字符串时才替换? 仅在特定上下文中找到字符串时才替换? 如果字符串在某个行号上,请替换? 用相同的替换替换多个字符串 用不同的替换项替换多个字符串
751 text-processing  awk  sed  perl 

4
为什么printf比echo好?
我听说printf比更好echo。从我的经验中,我只能回忆起一个必须使用的实例,printf因为它echo无法将某些文本输入RHEL 5.8上的某个程序,但是可以printf。但是显然还有其他差异,我想询问一下它们是什么,以及是否存在特定情况下何时使用一种对另一种。

10
如何在文件中追加多行
我正在编写一个bash脚本来查找文件(如果不存在),然后创建该文件并将其附加到该文件: Host localhost ForwardAgent yes 因此,"line then new line 'tab' then text"我认为它是一种敏感格式。我知道您可以这样做: cat temp.txt >> data.txt 但自从两行开始,这似乎很奇怪。有没有办法以这种格式附加它: echo "hello" >> greetings.txt

8
grep只能输出匹配的指定分组吗?
说我有一个文件: # file: 'test.txt' foobar bash 1 bash foobar happy foobar 我只想知道“ foobar”之后出现的单词,因此可以使用此正则表达式: "foobar \(\w\+\)" 括号表示我对foobar之后的单词有特别的兴趣。但是当我执行a时grep "foobar \(\w\+\)" test.txt,我得到的行与整个正则表达式匹配,而不仅仅是“ foobar之后的单词”: foobar bash 1 foobar happy 我更希望该命令的输出如下所示: bash happy 有没有办法告诉grep仅在正则表达式中输出与分组(或特定分组)匹配的项目?

4
为什么使用shell循环处理文本被认为是不好的做法?
在POSIX Shell中,通常使用while循环处理文本是否被认为是不好的做法? 正如StéphaneChazelas指出的,不使用shell循环的一些原因是概念,可靠性,易读性,性能和安全性。 此答案解释了可靠性和易读性方面: while IFS= read -r line <&3; do printf '%s\n' "$line" done 3< "$InputFile" 为了提高性能,从文件或管道中读取时,while循环和读取速度非常慢,因为内置的读取外壳一次读取一个字符。 怎么样的概念和安全性方面?

18
您如何按尺寸对输出进行排序?
您如何du -sh /dir/*按大小排序?我读了一个说使用的网站,| sort -n但这显然是不对的。这是一个错误的例子。 [~]# du -sh /var/* | sort -n 0 /var/mail 1.2M /var/www 1.8M /var/tmp 1.9G /var/named 2.9M /var/run 4.1G /var/log 8.0K /var/account 8.0K /var/crash 8.0K /var/cvs 8.0K /var/games 8.0K /var/local 8.0K /var/nis 8.0K /var/opt 8.0K /var/preserve 8.0K /var/racoon 12K /var/aquota.user 12K /var/portsentry 16K /var/ftp 16K /var/quota.user …



6
如何以特定的列大小换行?
我知道我可以使用类似的cat test.txt | pr -w 80方法将行换成80个字符的宽度,但这会在打印行的顶部和底部留出很多空间,并且在某些系统上不起作用 强制将长行文本文件以一定宽度换行的最佳方法是什么? 奖励积分,如果您可以防止其断言。

14
将字符串替换为一个巨大的(70GB)一行文本文件
我有一个巨大的(70GB),一行,文本文件,我想替换其中的一个字符串(令牌)。我想<unk>用另一个虚拟令牌替换该令牌(手套发行)。 我试过了sed: sed 's/<unk>/<raw_unk>/g' < corpus.txt > corpus.txt.new 但是输出文件corpus.txt.new有零字节! 我也尝试使用perl: perl -pe 's/<unk>/<raw_unk>/g' < corpus.txt > corpus.txt.new 但是我遇到了内存不足的错误。 对于较小的文件,以上两个命令均有效。 如何替换这样的文件字符串? 这是一个相关的问题,但是没有一个答案对我有用。 编辑:将文件分成10GB(或其他大小)的块,然后分别应用于sed每个文件,然后与它们合并,该cat怎么办?那有意义吗?有没有更优雅的解决方案?

9
如何删除文本文件中的重复行?
我的一个巨大的文本文件(最多2 GiB)包含其中每一行的大约100个精确重复项(对我而言,这是无用的,因为该文件是类似CSV的数据表)。 我需要的是在保持原始序列顺序的同时删除所有重复(最好是牺牲掉,但这可以显着提高性能)。结果,每一行都是唯一的。如果有100条相等的行(通常重复项分布在文件中并且不会成为邻居),则只剩下其中一种。 我已经用Scala编写了一个程序(如果您不了解Scala,请考虑使用Java)来实现此目的。但是,也许有更快的C编写的本机工具能够更快地做到这一点? 更新:awk '!seen[$0]++' filename只要文件接近2 GiB或更小,该解决方案对我来说似乎就很好,但是现在我要清理8 GiB文件就不再起作用了。在配备4 GiB RAM和配备4 GiB RAM和6 GiB交换功能的64位Windows 7 PC的Mac上,似乎占用了无限空间。鉴于这种经验,我并不热衷于在具有4 GiB RAM的Linux上进行尝试。

6
使用bash从变量中删除特定字符
我想解析一个变量(在我的情况下,它是开发套件的版本)以使其.免于dot()。如果为version='2.3.3',则所需的输出为233。 我尝试如下进行操作,但是.必须替换为另一个给我的字符2_3_3。如果tr . ''可以的话,那会很好。 1 VERSION='2.3.3' 2 echo "2.3.3" | tr . _

4
仅返回匹配模式后的行的一部分
因此,当我使用要处理的特定日志集时,仅cat使用拉开文件然后使用grep来获取匹配行就可以了。它需要一种将线与模式匹配的方法,但只需要在匹配后返回该线的一部分。比赛之前和之后的部分将不断变化。我使用过sed或awk,但无法弄清楚如何过滤线以删除比赛之前的部分,或者仅在比赛之后返回部分,这两种方法都可以使用。这是我需要过滤的一行示例: 2011-11-07T05:37:43-08:00 <0.4> isi-udb5-ash4-1(id1) /boot/kernel.amd64/kernel: [gmp_info.c:1758](pid 40370="kt: gmp-drive-updat")(tid=100872) new group: <15,1773>: { 1:0-25,27-34,37-38, 2:0-33,35-36, 3:0-35, 4:0-9,11-14,16-32,34-38, 5:0-35, 6:0-15,17-36, 7:0-16,18-36, 8:0-14,16-32,34-36, 9:0-10,12-36, 10-11:0-35, 12:0-5,7-30,32-35, 13-19:0-35, 20:0,2-35, down: 8:15, soft_failed: 1:27, 8:15, stalled: 12:6,31, 20:1 } 我需要的部分是“停顿”之后的所有内容。 其背后的背景是,我可以找出停顿的频率: cat messages | grep stalled | wc -l 我需要做的是找出某个节点已停顿了多少次(由“停顿”后每个冒号之前的部分指示。如果我只是为此而grep(即20 :),它可能会返回软失败的行,但是我只需要过滤停顿的部分,这样我就可以从停顿的那些节点中为特定节点进行grep。 出于所有目的和目的,这是一个具有标准GNU核心utils的freebsd系统,但是我无法安装任何额外的辅助工具。

13
解码URL编码(百分比编码)
我想解码URL编码,是否有任何内置工具可以执行此操作,或者有人可以为我提供sed执行此操作的代码吗? 我确实在unix.stackexchange.com和互联网上进行了一些搜索,但是找不到用于解码url编码的任何命令行工具。 我想做的就是简单地就地编辑txt文件,以便: %21 变成 ! %23 变成 # %24 变成 $ %26 变成 & %27 变成 ' %28 变成 ( %29 变成 ) 等等。

15
将字节数转换为人类KiB MiB等的标准工具;像du,ls1
是否有一个标准工具可以将字节的整数计数转换为人类可读的最大可能的单位大小的计数,同时将数值保持在1.00和1023.99之间? 我有自己的bash / awk脚本,但是我正在寻找一个标准工具,该工具可以在许多/大多数发行版中找到……更通用的工具,理想情况下具有简单的命令行参数,并且/或者可以接受管道输入。 这是我要查找的输出类型的一些示例。 1 Byt 173.00 KiB 46.57 MiB 1.84 GiB 29.23 GiB 265.72 GiB 1.63 TiB 这是bytes-human脚本(用于以上输出) awk -v pfix="$1" -v sfix="$2" 'BEGIN { split( "Byt KiB MiB GiB TiB PiB", unit ) uix = uct = length( unit ) for( i=1; i<=uct; i++ ) val[i] = …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.