我有多个gnuplot文件,我希望在当前目录中查找并替换“ gnuplot_RTre _ *。gnplt”一系列文件的“ set xrange [0:20]”为“ set xrange [0:3]” 。我发现了如何交换文件夹中所有文件中的特定字符串,而不只是交换特定文件,包括特殊字符。
所以我尝试了
find . -type f -name "gnuplot_RTre_*.gnplt" -exec sed -i 's/set xrange [0:20]/set xrange [0:3]/g' {} +
它不会出错,但是不会交换这些文件中的任何内容。因此,我尝试使用反斜杠
来转义特殊字符find . -type f -name "gnuplot_RTre_*.gnplt" -exec sed -i 's/set xrange \\[\\0\\:\\20\\]\\/set xrange \\[\\0\\:\\3\\]\\/g' {} +
仍然无法正常工作,没有错误,但是没有交换。
我也尝试过
grep -rl 'set xrange [0:20]' ./ | xargs sed -i 's/set xrange [0:20]/set xrange [0:3]/g' gnuplot_RTre_*.gnplt
但是它不能正常工作。
我认为我的命令在特殊字符转义或文件选择方面是错误的,但不确定如何解决此问题。需要一些帮助。
谢谢
答案 0 :(得分:1)
您还有多余的反斜杠以转义特殊字符。请尝试:
# find . -type f -name "gnuplot_RTre_*.gnplt" -exec sed -i 's/set xrange \[0:20]/set xrange \[0:3]/g' {} +
# The backslash in the REPLACEMENT above is unnecessary, although harmless.
# Please adopt the following instead.
find . -type f -name "gnuplot_RTre_*.gnplt" -exec sed -i 's/set xrange \[0:20]/set xrange [0:3]/g' {} +
在sed
中,字符$.*[\^
必须以反斜杠转义以将其视为文字。
[编辑]
右方括号"]"
在正则表达式中通常不是特殊字符,
您不必随便安装它:
echo "[abc]" | sed 's/]/*/g'
=> [abc*
但是,如果"]"
的行为像元字符一样,但在其前面加上未转义的左方括号"["
来组成character class
。
echo "[abc]abc" | sed 's/[abc]/*/g'
=> [***]***
为了使"["
为文字,我们需要对其进行转义。
echo "[abc]abc" | sed 's/\[abc]/*/g'
=> *abc
"]"
也可以出于视觉对称性而转义。
echo "[abc]abc" | sed 's/\[abc\]/*/g'
=> *abc