查找replace";/&引用;在awk中

查找replace";/&引用;在awk中,awk,Awk,我对使用linux非常陌生,我正在尝试查找/替换文件中的一些文本 我已成功使用gsub查找并替换“0/0”: awk'{gsub(/0\/0/,“0”)};1'文件名 但是,如果我尝试使用相同的想法替换“/” awk'{gsub(/\.\/\./,“U”)};1'文件名 输出被截断并在文件中第一个“/”的位置停止。我知道“.”是一个特殊的通配符,但我认为在它前面加“\”会使它无效。我已经搜索过了,但是找不到解释为什么我使用的公式会截断文件 任何想法都将不胜感激。谢谢。回想一下awk的基本轮廓是:

我对使用linux非常陌生,我正在尝试查找/替换文件中的一些文本

我已成功使用gsub查找并替换“0/0”:

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]
-->。