1

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

输入文件我有这个

{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

4 回答 4

1

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

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

第三,我不确定是否find input.txt会起作用。我猜你的意思是find . -type f -name input.txt

于 2010-10-13T13:39:46.460 回答
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在替换字符串中使用,而不是'.

于 2010-10-13T13:37:18.823 回答
0

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

于 2010-10-13T14:22:32.677 回答
-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"

我希望我会有所帮助

于 2011-06-24T05:34:03.847 回答