从Linux的特定文件中查找并替换单词和特殊字符

时间:2019-01-06 06:21:54

标签: sed replace grep special-characters

我有多个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

但是它不能正常工作。

我认为我的命令在特殊字符转义或文件选择方面是错误的,但不确定如何解决此问题。需要一些帮助。

谢谢

1 个答案:

答案 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