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

时间:2012-08-21 19:07:29

标签: path sed csh

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

sed s/AAA/BBB/ file

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

sed s/\\\/A\\\/A\\\A/BBB/ file

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

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

7 个答案:

答案 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 :允许编辑源文件

  • + :是定界符。

我希望以上信息对您有用。