我有一个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
.
小智 21
在替换字符串或模式字符串包含斜杠的情况下,您可以利用GNU sed允许替换命令的替代分隔符这一事实.分隔符的常见选择是管道字符| 或散列# - 分隔字符的最佳选择通常取决于正在处理的文件类型.在你的情况下,你可以尝试
sed -i 's#/path/to/AAA#/path/to/BBB#g' your_file
Run Code Online (Sandbox Code Playgroud)
注意:最后#后面的g是要更改文件中的所有实例,如果你想先改变你不要使用g
csh
通常不建议使用用于严重脚本编写的脚本。但是,这与当前的问题有关。
您可能正在追求类似:
sed -e "s=$oldpath=$newpath="
Run Code Online (Sandbox Code Playgroud)
其中shell变量$oldpath
包含要替换的值并$newpath
包含替换,并且假定两个变量都不包含等号。也就是说,您可以在pattern上选择定界符,避免使用通常的/
定界符可以避免出现路径名中的斜杠问题。如果您认为=
可能出现在文件名中,请选择不太可能出现的名称,例如control-A或control-G。