我有以下行要在脚本中执行,并删除上面的两行。但现在我的 $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/.*//
...也就是说,您只是想清除线路。您可以使用g
et 用空白保留空间覆盖模式空间 -(至少,在这个脚本中它将是空白的,因为它在您的示例中没有使用)。您也可以z
在 GNU 中使用 apsed
来实现相同的目的。