我有一个csh脚本(虽然我可以更改语言,如果它有任何相关性)我必须:
sed s/AAA/BBB/ file
问题是AAA和BBB是路径,因此包含'/'。 AAA是固定的,所以我可以说:
sed s/\\\/A\\\/A\\\A/BBB/ file
但是,BBB基于变量,包括$ PWD。如何逃避$ PWD中的'/'?
还有其他一些方法我应该完全这样做吗?
答案 0 :(得分:70)
sed
可以在/
命令中使用任何分隔符而不是s
。只需使用路径中未遇到的内容:
s+AAA+BBB+
等等。
或者(如果你不想猜),你可以用sed预处理你的路径以逃避斜杠:
pwdesc=$(echo $PWD | sed 's_/_\\/_g')
然后使用$pwdesc
执行您需要的操作。
答案 1 :(得分:19)
在替换字符串或模式字符串包含斜杠的情况下,您可以利用GNU sed允许替换命令的替代分隔符这一事实。分隔符的常见选择是管道字符|或散列# - 分隔字符的最佳选择通常取决于正在处理的文件类型。在你的情况下,你可以尝试
sed -i 's#/path/to/AAA#/path/to/BBB#g' your_file
注意:最后一个#后面的g是要更改文件中的所有内容,如果你想先改变你不要使用g
答案 2 :(得分:5)
使用csh
进行严肃的脚本编写通常是not recommended。但是,这与当前的问题相关。
你可能会喜欢这样的事情:
sed -e "s=$oldpath=$newpath="
其中shell变量$oldpath
包含要替换的值,$newpath
包含替换值,并且假设两个变量都不包含等号。也就是说,您可以在模式上选择分隔符,并避免使用通常的/
分隔符来避免路径名中的斜杠问题。如果您认为文件名中可能出现=
,请选择不太可能出现的内容,例如control-A或control-G。
答案 3 :(得分:3)
sed -i "s|$fileWithPath|HAHA|g" file
答案 4 :(得分:0)
您可以使用括号扩展${i/p/r}
来转义斜杠。
在这种情况下${i//p/r}
用于转义所有事件。
$p1=${p1//\//\\/}
$p2=${p2//\//\\/}
sed s/$p1/$p2/ file
或者,更简洁,在一行sed s/${p1//\//\\/}/${p2//\//\\/}/ file
两个第一个斜杠//
是括号扩展中的分隔符,表示我们匹配所有匹配项,然后\/
用于转义搜索模板中的斜杠,/
作为第二个扩展中的分隔符,然后\\/
是替换,因为反斜杠必须被转义。
答案 5 :(得分:0)
我们只需要从路径中获取/ h /网络路径引用即可。如果我们将它们指向/ c /驱动器,它们将映射到不存在的目录,但会快速解析。在我的.bashrc文件中,我使用了
PATH=`echo $PATH | sed -e "s+/h/+/c/+g"`
答案 6 :(得分:0)
就我而言,以下方法有效。
sed -i 's/playstation/PS4/' input.txt
也可以写为
sed -i 's+playstation+PS4+' input.txt
sed :是流编辑器
-i :允许编辑源文件
+ :是定界符。
我希望以上信息对您有用。