68

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

sed s/AAA/BBB/ file

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

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

但是,BBB 是基于变量的,包括 $PWD。如何转义 $PWD 中的“/”?

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

4

7 回答 7

137

sed可以使用任何分隔符而不是/s命令中。只需使用路径中未遇到的东西:

s+AAA+BBB+

等等。

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

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

然后用$pwdesc.

于 2012-08-21T19:12:49.783 回答
47

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

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

注意:最后一个 # 后面的 g 是要更改文件中的所有匹配项,如果要更改第一次出现,请不要使用 g

于 2014-10-28T08:29:37.313 回答
16
sed -i "s|$fileWithPath|HAHA|g" file

编辑 1

sed -i 's|path/to/foo|path/to/bar|g' file
于 2014-11-19T23:36:33.240 回答
8

csh通常不推荐用于严肃的脚本。然而,这与手头的问题无关。

你可能在追求类似的东西:

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

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

于 2012-08-21T19:10:43.147 回答
3

就我而言,以下方法有效。

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

也可以写成

sed -i 's+playstation+PS4+' input.txt
  • sed : 是流编辑器

  • -i : 允许编辑源文件

  • +:是分隔符。

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

于 2020-08-18T10:14:29.247 回答
2

我们只需要从路径中获取 /h/ 网络路径引用。如果我们将它们指向 /c/ 驱动器,它们将映射到不存在的目录但很快就会解决。在我的 .bashrc 中,我使用了

PATH=`echo $PATH | sed -e "s+/h/+/c/+g"`
于 2019-06-12T15:16:01.597 回答
0

您可以使用括号扩展${i/p/r}来转义斜杠。在这种情况下${i//p/r},用于转义所有事件。

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

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

两个拳头斜杠//是括号展开中的分隔符,表示我们匹配所有出现,然后\/是用于转义搜索模板中的斜杠,/作为展开中的第二个分隔符,然后\\/是替换,在巫婆中必须转义反斜杠.

于 2015-01-12T14:41:47.670 回答