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

Sed 从linux的特定文件中查找并替换单词和特殊字符,sed,replace,grep,special-characters,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' {} + 它

我有一些多个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
但它也不起作用

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


谢谢

您有额外的反斜杠来转义特殊字符。请尝试:

# 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
中,字符
$.[\^
需要用反斜杠转义,以将其视为文字

[编辑]
右方括号
“]”
在正则表达式和 您不必对其进行Escape:

echo "[abc]" | sed 's/]/*/g'
=> [abc*
但是,
“]”
如果前面有一个未缩放的左方括号,
“[”
组成一个
字符类,则其行为类似于元字符

echo "[abc]abc" | sed 's/[abc]/*/g'
=> [***]***
为了使
“[”
成为文字,我们需要对其进行转义

echo "[abc]abc" | sed 's/\[abc]/*/g'
=> *abc
“]”
也可以仅为了视觉对称性而转义

echo "[abc]abc" | sed 's/\[abc\]/*/g'
=> *abc

谢谢,这比我想象的要简单。我想我需要转义这里的所有特殊字符,即“[”、“]”和“:”。但是反斜杠似乎只在“[”.所以,“]”和“]”不被视为特殊字符,对吗?“]”不是特殊字符,除非前面有未转义的“[”。我在我的答案中添加了一个解释。顺便说一句,在我以前的答案中,我在替换项中添加了反斜杠以转义“[”,这是不必要的。我已更新了我的答案。BR。