当变量中包含“/”时如何使用 sed?

当变量中包含“/”时如何使用 sed?

我有以下行要在脚本中执行,并删除上面的两行。但现在我的 $TEST 变量包含“/DATA/test10”等值,并且我的变量 ID 包含“10”。我如何将它与 sed 一起使用?

sed -i ":a;N;s/\n/&/2;Ta;/path = $TEST\/$ID/s/.*//;P;D" /collection.txt

答案1

如果你只是想将字符串视为文字sed已经有一个答案了:

escaped_testx="$(sed -e 's/[\/&]/\\&/g' <<< "$TEST"; echo x)"
escaped_test="${escaped_testx%x}"

额外的x是能够处理尾随换行符,否则将通过命令替换删除。

答案2

使用 / 作为命令的分隔字符sed s不是强制性的。分隔符是 s 之后的第一个字符。您可以使用|#或(几乎)任何您喜欢的东西。对于包含大量/字符的内容(例如文件名路径),我喜欢使用逗号,因为它们位于基线下方,因此更容易查看,但在文件名中很少见:

sed 's,^/home/me/subdir/,^/home/he/otherdir/,'

选择您在搜索中找不到的字符并替换。如果确实有一两个,请在它们前面加上反斜杠。

答案3

在正则表达式中,您可以通过在前面添加反斜杠来转义字符。

于是就/变成了\/

这会让你的正则表达式看起来很难看(s/\/home\/stuff\/dir1/\/home\/stuff/),但它确实有效!

答案4

如果你想避免实际修改变量的值,你可以直接流式传输:

printf "%s\n" "$PATH/$ID"   |
sed   -e's|[]$/.\^[]|\\&|g' \
      -e's|.*|/path = &/g|' |
sed   -e':a;N;s/\n/&/2;Ta' -f- -eP\;D /collection.txt

它假设两个变量都不能包含换行符。它还做出了一个假设:

/path = $TEST\/$ID/s/.*//

...也就是说,您只是想清除线路。您可以使用get 用空白保留空间覆盖模式空间 -(至少,在这个脚本中它将是空白的,因为它在您的示例中没有使用)。您也可以z在 GNU 中使用 apsed来实现相同的目的。

相关内容