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

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

sed s/AAA/BBB/ file

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

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

然而,BBB 是基于变量的,包括 $PWD。如何在 $PWD 中转义’/’?

还是说我完全可以用别的方法来做这件事?

129963 次浏览

使用 csh编写严肃的脚本通常是使用 不推荐

你可能想要这样的东西:

sed -e "s=$oldpath=$newpath="

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

s命令中,sed可以使用任何分隔符而不是 /。只要使用在你的道路上没有遇到的东西:

s+AAA+BBB+

诸如此类。

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

pwdesc=$(echo $PWD | sed 's_/_\\/_g')

然后做你需要的 $pwdesc

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

sed -i 's#/path/to/AAA#/path/to/BBB#g' your_file

注意: 最后 # 后面的 g 是改变文件中的所有事件,如果你想改变第一个事件不要使用 g

sed -i "s|$fileWithPath|HAHA|g" file

编辑1

sed -i 's|path/to/foo|path/to/bar|g' file

可以使用括号展开 ${i/p/r}来转义斜杠。 在本例中,${i//p/r}用于转义所有事件。

$p1=${p1//\//\\/}
$p2=${p2//\//\\/}
sed s/$p1/$p2/ file

或者,更简洁地说,在一行 sed s/${p1//\//\\/}/${p2//\//\\/}/ file

两个拳头斜杠 //是括号展开中的一个分隔符,表示匹配所有匹配项,然后 \/用于转义搜索模板中的斜杠,/作为展开中的第二个分隔符,然后 \\/作为替换,其中反斜杠必须转义。

我们只需要将/h/network 路径引用从路径中移除。如果我们将它们指向/c/drive,它们将映射到不存在的目录,但会很快解析。在我的。我用过的巴希尔

PATH=`echo $PATH | sed -e "s+/h/+/c/+g"`

在我的例子中,下面的方法是有效的。

sed -i 's/playstation/PS4/' input.txt

也可以写成

sed -i 's+playstation+PS4+' input.txt
  • Sed : is stream Editor

  • - i : 允许编辑源文件

  • + : Is 分隔符。

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