如何用sed中的另一个路径替换路径?

Bri*_*tow 37 csh sed path

我有一个csh脚本(虽然我可以更改语言,如果它有任何相关性)我必须:

sed s/AAA/BBB/ file
Run Code Online (Sandbox Code Playgroud)

问题是AAA和BBB是路径,因此包含'/'.AAA是固定的,所以我可以说:

sed s/\\\/A\\\/A\\\A/BBB/ file
Run Code Online (Sandbox Code Playgroud)

但是,BBB基于变量,包括$ PWD.如何逃避$ PWD中的'/'?

还有其他方法我应该完全这样做吗?

Lev*_*sky 84

sed可以使用任何分离器,而不是/s命令.只需使用路径中未遇到的内容:

s+AAA+BBB+
Run Code Online (Sandbox Code Playgroud)

等等.

或者(如果你不想猜),你可以使用sed预处理你的路径以逃避斜杠:

pwdesc=$(echo $PWD | sed 's_/_\\/_g')
Run Code Online (Sandbox Code Playgroud)

然后做你需要的$pwdesc.

  • 有趣.我从来不知道'/'实际上并不是sed的一部分...所有人似乎都默认使用它,所以我只是认为它是强制性的.谢谢. (3认同)

小智 21

在替换字符串或模式字符串包含斜杠的情况下,您可以利用GNU sed允许替换命令的替代分隔符这一事实.分隔符的常见选择是管道字符| 或散列# - 分隔字符的最佳选择通常取决于正在处理的文件类型.在你的情况下,你可以尝试

sed -i 's#/path/to/AAA#/path/to/BBB#g' your_file
Run Code Online (Sandbox Code Playgroud)

注意:最后#后面的g是要更改文件中的所有实例,如果你想先改变你不要使用g


pyl*_*ver 13

sed -i "s|$fileWithPath|HAHA|g" file
Run Code Online (Sandbox Code Playgroud)


Jon*_*ler 5

csh通常不建议使用用于严重脚本编写的脚本。但是,这与当前的问题有关。

您可能正在追求类似:

sed -e "s=$oldpath=$newpath="
Run Code Online (Sandbox Code Playgroud)

其中shell变量$oldpath包含要替换的值并$newpath包含替换,并且假定两个变量都不包含等号。也就是说,您可以在pattern上选择定界符,避免使用通常的/定界符可以避免出现路径名中的斜杠问题。如果您认为=可能出现在文件名中,请选择不太可能出现的名称,例如control-A或control-G。