sed - 从 linux 的特定文件中查找和替换单词和特殊字符
问题描述
我有一些多个 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
中,字符$.*[\^
需要用反斜杠转义才能被视为文字。
[编辑]
右方括号"]"
通常不是正则表达式中的特殊字符,您不必转义它:
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
推荐阅读
- python - 如何使用 matplotlib 在 Python 中为 Voronoi 镶嵌的多边形创建轮廓?
- javascript - Flask 可以读取 POST 数据,但不能读取另一个
- javascript - Moodle 损坏的上传文件
- aws-lambda - 在本地运行的 AWS SAM 无法解析 FindInMap Intrinsic
- arrays - 将对象数组传递给在迭代中渲染的子组件会在 React 中返回未定义的错误
- javascript - 带有 vaadin 路由器和处理页面刷新的 vanilla js Web 组件中的嵌套路由
- avro - avro 可选字段默认 null 不起作用
- javascript - 发送到我的 node.js 服务器的数据没有被发送回客户端
- netbeans - 每次运行程序时都会运行旧代码
- javascript - 我想有条件地在 Next.js 上呈现页面