我是shell脚本新手。我正在使用ksh。
我的脚本中有这一特定行,用于将变量a
中的文本追加到变量sed -i ''$a's@$@'"$q"'@' test.txt
给定的特定行的末尾
包含行号。
q
现在,变量sed "s/'/ /g" | sed 's/"/ /g'
可以包含大量文本,包含各种特殊字符,例如!@#$%^& *()_ +:"<> 。,/;' [] =等等,没有例外。
现在,我在脚本中使用了几个sed命令来删除任何'和"在本文中(sed: -e expression #1, char 168: unterminated `s' command
),但是当我执行上述命令时,我收到以下错误
{{1}}
任何sed,awk,perl,建议都非常感谢
答案 0 :(得分:1)
这里的难点是在sed命令中引用(转义)替换分隔符@
:
sed -i ''$a's@$@'"$q"'@' test.txt
例如,如果q
包含@
,则无效。 @
将提前终止替换模式。示例:q='a@b'
,a=2
,命令扩展为
sed -i 2s@$@a@b@ test.txt
不会将a@b
附加到第2行的末尾,而是a@
。
这可以通过转发@
中的q
字符来解决:
sed -i 2s@$@a\@b@ test.txt
然而,这种逃避在shell中可能很麻烦。
另一种方法是使用另一级别的间接。以下是使用Perl单线程的示例。第一个q
以引用形式传递给脚本。然后,在脚本中将变量分配给新的内部变量$q
。使用此方法无需转义替换分隔符字符:
perl -pi -E 'BEGIN {$q = shift; $a = shift} s/$/$q/ if $. == $a' "$q" "$a" test.txt
答案 1 :(得分:0)
不要试图消毒字符串。只需将其放在一个文件中,然后使用sed的r
命令将其读入:
echo "$q" > tmpfile
sed -i -e ${a}rtmpfile test.txt
啊,但这会产生一个你不想要的额外换行符。您可以使用以下命令将其删除:
sed -e ${a}rtmpfile test.txt | awk 'NR=='$a'{printf $0; next}1' > output
答案 2 :(得分:0)
另一种方法是使用补丁实用程序(如果系统中存在)。
patch test.txt <<-EOF
${a}c
$(sed "${a}q;d" test.txt)$q
.
EOF
${a}c
将替换为后跟c
的行号,这意味着操作是行${a}
中的更改。
第二行是替换更改。这是原始文本和添加文本的连接值。
唯一.
表示执行命令。