带有转义的 Linux SED 命令语法

标签 linux sed

我正在尝试用子目录中的脚本调用替换脚本调用。

例如,最初我有 ./output.sh在我的脚本中调用 output.sh当前目录中的脚本。

我想替换./output.sh../output.sh这样它就可以调用 output.sh在父目录中。

我试过了

sed -i -e 's/../\output.sh/./\output.sh/g' scriptName.sh

这会返回

char 17: unknown option to 's'

任何有关 sed 转义字符语法的帮助都会很棒。

最佳答案

Sed 在这方面表现不佳;如果您不小心,您将面临将现有的 ../output.sh 转换为 .../output.sh 的风险。

这是 sed 能做的最好的事情:

sed -i 's@output\.sh@../$@g' scriptName.sh

(我使用 @ 代替 /,这样就没有要转义的正斜杠。Sed 接受任何标点符号字符来代替正斜杠。)

请注意,这会将 ../output.sh 转换为 ../../output.sh 但至少不会产生三点错误。

相反,尝试 perl:

perl -pie 's@(?<!\.\./)(output\.sh\b)@../$1@g' scriptName.sh

这使用负向后查找来确保它不会遍历到父级的父级。它还允许使用 \b 来表示分词,以防万一您在某处有类似 output.shelf 的内容。

关于带有转义的 Linux SED 命令语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41491193/

相关文章:

html - C Linux HTML 条不工作

regex - 使用 sed 在附加文本之前追加两个新行

linux - sed 删除所有匹配项的一部分

bash - 如何继续读取文件?

linux - 在目录和子目录中查找并替换为 sed

awk - 正则表达式从一个段落中提取多个单词

linux - 在 Linux x86_64 系统调用和 int 0x80 相关吗?

linux - 减少汇编指令数

c - 生成 4 个字节的(伪)随机数据

linux - 如何知道 Socket 客户端断开连接?