我是使用Linux的新手,我正在尝试查找/替换我文件中的一些文本。
我已成功找到并使用gsub:
替换“0/0” awk '{gsub(/0\/0/,"0")}; 1' filename
但是,如果我尝试替换“./。”使用相同的想法
awk '{gsub(/\.\/\./,"U")}; 1' filename
输出被截断并停在第一个“./”的位置。在文件中。我知道 ”。”是一个特殊的通配符,但我认为在它前面加上“\”会中和它。我已搜索但无法找到解释为什么我使用的公式会截断文件。
任何想法都会非常感激。谢谢。
答案 0 :(得分:1)
回想一下awk
的基本轮廓是:
awk 'pattern { action }'
最常见的模式是正则数据或针对行数的测试:
awk '/FOO/ { do_something_with_a_line_with_FOO_in_it }'
awk 'FNR==10'
最后一个没有动作,所以默认是打印线。
但是返回值的函数也可用作模式。 gsub
是一个函数,返回替换次数。
所以给出:
$ echo "$txt"
abc./.def line 1
ghk/lmn won't get printed
abc./.def abc./.def printed
要仅打印具有成功替换的行,您可以执行以下操作:
$ echo "$txt" | awk 'gsub(/\.\/\./,"U")'
abcUdef line 1
abcUdef abcUdef printed
您不需要将gsub
放入操作块,因为您希望在每一行上运行它,并且返回会告诉您发生了什么。由于gsub
返回替换次数,因此会打印成功匹配的行。
如果您想要打印每一行,无论是否匹配:
$ echo "$txt" | awk 'gsub(/\.\/\./,"U") || 1'
abcUdef line 1
ghk/lmn won't get printed
abcUdef abcUdef printed
或者,您可以将该函数用作具有空模式的操作,然后使用1
执行空操作:
$ echo "$txt" | awk '{gsub(/\.\/\./,"U")} 1'
abcUdef line 1
ghk/lmn won't get printed
abcUdef abcUdef printed
在任何一种情况下,1
作为没有操作的模式打印该行,无论是否匹配,gsub
进行替换(如果有)。
第二个awk
就是你拥有的。为什么它不能处理您的输入数据可能与您输入数据有关。
答案 1 :(得分:1)
你的awk脚本没问题,你的输入包含control-Ms,可能是由Windows程序创建的。您可以使用cat -v file
查看这些内容并使用dos2unix
或类似信息将其删除。