gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:23:08 26 4
gpt4 key购买 nike

我是 shell 脚本的新手。我正在使用 ksh。

我的脚本中有这一行,用于将变量 q 中的文本附加到变量 a 给出的特定行的末尾 包含行号。

sed -i ''$a's@$@'"$q"'@' test.txt

现在变量 q 可以包含大量文本,带有各种特殊字符,例如 !@#$%^&*()_+:"<>.,/;'[]= 等等,无一异常(exception)。
目前,我在我的脚本中使用了几个 sed 命令来删除本文中的任何 ' 和 "(sed "s/'//g"| sed 's/"//g'), 但是当我执行上面的命令时我仍然得到以下错误

sed: -e expression #1, char 168: unterminated `s' command

非常感谢任何 sed、awk、perl 的建议

最佳答案

这里的难点在于引用(转义)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

关于Linux:使用行号作为变量将变量附加到行尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42980331/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com