我有一些替换命令的问题。
输入文件我有这个
{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 `('
答案 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“
我希望我能提供帮助