Linux:使用行号作为变量将变量附加到行尾

时间:2017-03-23 15:24:12

标签: linux perl awk sed

我是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,建议都非常感谢

3 个答案:

答案 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}中的更改。

第二行是替换更改。这是原始文本和添加文本的连接值。

唯一.表示执行命令。