查找replace";/&引用;在awk中
我对使用linux非常陌生,我正在尝试查找/替换文件中的一些文本 我已成功使用gsub查找并替换“0/0”:查找replace";/&引用;在awk中,awk,Awk,我对使用linux非常陌生,我正在尝试查找/替换文件中的一些文本 我已成功使用gsub查找并替换“0/0”: awk'{gsub(/0\/0/,“0”)};1'文件名 但是,如果我尝试使用相同的想法替换“/” awk'{gsub(/\.\/\./,“U”)};1'文件名 输出被截断并在文件中第一个“/”的位置停止。我知道“.”是一个特殊的通配符,但我认为在它前面加“\”会使它无效。我已经搜索过了,但是找不到解释为什么我使用的公式会截断文件 任何想法都将不胜感激。谢谢。回想一下awk的基本轮廓是:
awk'{gsub(/0\/0/,“0”)};1'文件名
但是,如果我尝试使用相同的想法替换“/”
awk'{gsub(/\.\/\./,“U”)};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
就是您所拥有的。它不处理您的输入数据的原因可能与您的输入数据有关。回想一下,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
就是您所拥有的。它无法处理您的输入数据的原因可能与您的输入数据有关。您的awk脚本很好,您的输入包含控件Ms,可能是由Windows程序创建的。您可以使用cat-v文件查看它们,并使用dos2unix
或类似方法删除它们。您的awk脚本很好,您的输入包含控件Ms,可能是由Windows程序创建的。您可以使用cat-v文件查看它们,并使用dos2unix
或类似工具删除它们。awk
不是执行此类操作的最佳工具。如果允许您自己选择,我建议改用sed
。如果我使用echo“abc./.def”| awk'gsub(/\.\/\./,“U”)
它可以正常工作。@melpomene您知道您也可以说[mcve]
-->。awk
不是进行此类操作的最佳工具。如果允许您自己选择,我建议使用sed
。如果我使用echo“abc./.def”| awk'gsub(/\.\/\./,“U”)
它可以正常工作。@melpomene您知道您也可以说[mcve]
-->。