找到替换“./。”在awk

时间:2017-01-14 00:31:09

标签: awk

我是使用Linux的新手,我正在尝试查找/替换我文件中的一些文本。

我已成功找到并使用gsub:

替换“0/0”

awk '{gsub(/0\/0/,"0")}; 1' filename

但是,如果我尝试替换“./。”使用相同的想法

awk '{gsub(/\.\/\./,"U")}; 1' filename

输出被截断并停在第一个“./”的位置。在文件中。我知道 ”。”是一个特殊的通配符,但我认为在它前面加上“\”会中和它。我已搜索但无法找到解释为什么我使用的公式会截断文件。

任何想法都会非常感激。谢谢。

2 个答案:

答案 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或类似信息将其删除。