替换命令有问题

时间:2010-10-13 13:26:29

标签: linux unix sed awk nawk

我有一些替换命令的问题。

输入文件我有这个

{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}

我想用单引号替换

'{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}'

使用下面提到的命令

find input.txt -exec sed 's/{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}/'{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}'/g' {} \;

我收到这样的错误

bash: syntax error near unexpected token `('

4 个答案:

答案 0 :(得分:1)

首先,您不能轻易地在用单引号分隔的参数中插入文字单引号 您必须将'替换为'"'"''\'' 作为猜测这个问题的提示,在这里,投诉来自shell,这意味着即使您的命令行也是格式错误。

其次,您应该知道美元和圆括号是sed正则表达式中的特殊字符。你可能不得不逃避它们。有关详细信息,请阅读man sed

第三,我不确定find input.txt是否有效。我想你的意思是find . -type f -name input.txt

答案 1 :(得分:0)

这是因为替换字符串中的裸'实际上正在终止sed命令,这意味着shell正在尝试处理该行。当Benoit的编辑正确地将您的问题引入语法颜色时,这实际上变得非常明显。您可以看到该行上的第二个'(替换文本的第一个字符)由于字符串终止而将颜色从红色更改为黑色。

此外,sed不喜欢使用裸[],因为它们表示正则表达式中的字符类。

您可以使用以下方法修复这两个问题:

pax> find input.txt -exec sed 's/{a\[$1\]=a\[$1\]FS$2}END{for(i in a) print i,a\[i\]}/\x27{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}\x27/g' {} \;

输出:

'{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}'

所以基本上,转义搜索字符串中的方括号,以便将它们视为文字并在替换字符串中使用\x27而不是'

答案 2 :(得分:0)

我发现为什么你应该这样做很有趣。你应该首先编写正确的代码,因为我可以看到它的awk代码。在创建它时,请不要告诉我你在input.txt文件中故意省略单引号?它只是你编辑的一个文件。没有必要使用find。 (除非你不知道它在哪里)。

答案 3 :(得分:-1)

最后我找到了简单的方法来做到这一点。

cat input.txt sed“s / {a [$ 1] = a [$ 1] FS $ 2} END {for(i in a)print i,a [i]} /'{a [$ 1] = a [ $ 1] FS $ 2} END {for(i in a)print i,a [i]}'/ g“

我希望我能提供帮助