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

Posted

技术标签:

【中文标题】如何用sed中的另一个路径替换路径?【英文标题】:How to replace a path with another path in sed? 【发布时间】:2012-08-17 04:26:39 【问题描述】:

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

sed s/AAA/BBB/ file

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

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

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

或者我应该以其他方式完全做到这一点吗?

【问题讨论】:

【参考方案1】:

sed 可以在s 命令中使用任何分隔符代替/。只需使用您的路径中没有遇到的东西:

s+AAA+BBB+

等等。

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

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

然后使用$pwdesc 做你需要做的事情。

【讨论】:

有趣。我从来不知道 '/' 实际上不是 sed 的一部分......每个人似乎都默认使用它,所以我只是假设它是强制性的。谢谢。 @LevLevitsky : 只是一个问题 :\bmatch a word 但什么匹配路径?这是因为我想在文件名之前附加一个路径,并且我想避免这样做两次。 @user2284570 不确定我是否理解这个问题。 \b 匹配单词边界,顺便说一句。也许您应该尝试提出一个新问题(或搜索现有问题)? 我有"crti.o$(crti.o)我需要在它们之前追加/var/path/,但是sed命令被调用了几次,所以它变成了"/var/path//var/path//var/path//var/path/crti.o$(/var/path//var/path/crti.o) @user2284570 然后您可能希望将名称匹配为不以斜杠开头的名称:\b[^\/]\w* 或类似名称。但我看不出与我们现在正在评论的答案有直接联系。【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:
sed -i "s|$fileWithPath|HAHA|g" file

编辑 1

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

【讨论】:

【参考方案4】:

使用csh 进行严肃的脚本通常是not recommended。但是,这与手头的问题无关。

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

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

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

【讨论】:

这不是严肃的脚本...(也不是严格意义上的滑稽,但它只有 43 行,包括空格和 cmets...)你是对的,如果它更长,我'会把它变成python。【参考方案5】:

在我的情况下,以下方法有效。

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

也可以写成

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

sed : 是流编辑器

-i : 允许编辑源文件

+:是分隔符。

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

【讨论】:

【参考方案6】:

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

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

【讨论】:

【参考方案7】:

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

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

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

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

【讨论】:

以上是关于如何用sed中的另一个路径替换路径?的主要内容,如果未能解决你的问题,请参考以下文章

如何用固定字符串替换部分路径?

sed 或 Perl 一行 + 如何仅在完全匹配时替换文件中的路径

SED在同一行中找到多个路径并将其替换为不同的路径

如何用bat删除和替换txt文本中的指定字符串,如把“我”换成“你”和把“我”删除? 请勿灌水!!

如何用线性渐变填充Android中的路径?

如何用 sed 替换缩小的 javascript 文件中的多个值 [重复]