将 sed 与变量、双引号、路径一起使用

Use sed with variable, double quote, path

提问人:rhadamanthe 提问时间:10/25/2023 最后编辑:tripleeerhadamanthe 更新时间:10/29/2023 访问量:84

问:

我正在尝试使用 . 该变量是对我要修改的路径的引用。sed

是否可以在下次启动时修改此脚本的文件中使用?sed

我试过了:

#!/bin/bash
main () {
newdir="/okl/dfsdf/dfsf/"
sed -i "s|mnt="/*/"|mnt="\$newdir"|g" file
}

main

我希望变量会改变,但只是在代码中第一次定义它时,这就是我需要双引号的原因。mntmnt="/*/"

bash 变量 sed

评论

0赞 Charles Duffy 10/25/2023
您需要对双引号进行转义,以使它们在双引号为字面意思。为了说明我的意思:有一个双引号字符串、一个单引号字符串和一个双引号字符串连接成一个字符串;它包含引号字符作为文本内容。"foo"'bar'"baz"foobarbaz
0赞 shellter 10/25/2023
这里有很多要评论的地方,但“改变但只是第一次”是值得的。在底部添加 和。保存脚本并运行。第二次运行。with 的行是实际执行的代码行。当你明白你所看到的是由你所写的东西产生的,你就会学到很多东西(-;。祝你好运。set -vx at the top of 'mainset +vx+
0赞 rhadamanthe 10/28/2023
谢谢你的建议!不知道set -vx
0赞 Walter A 10/28/2023
对于不完全理解你的问题的人,你有不同的答案。也许你比我们聪明,请添加示例输入文件,并显示命令后的样子。sed
0赞 tripleee 10/29/2023
我回滚了您的最新编辑。欢迎您澄清您原来的问题,但是当您已经收到多个答案时更改问题是不可接受的。同样,如果您仍然需要帮助,请接受其中一个答案并发布一个包含您实际要求的新问题。另请参阅帮助中心,特别是如何提问,以及提供最小可重现示例的指南。

答:

1赞 tripleee 10/25/2023 #1

眼前的两个问题是不能嵌套双引号,而且几乎可以肯定不是正确的正则表达式。/"*"/

在正则表达式中,简单地说就是尽可能多地重复前一个表达式零次或多次。所以你匹配 , , 等等。*"""""""""

猜测一下你可能希望你的代码应该做什么,我想你正在寻找类似的东西

sed -i "s|mnt=\"[^\"]*\"|mnt=\"$newdir\"|" file

标志说要匹配一行上的所有事件,但我想你无论如何都不会期望有多个。g

将其包装到一个函数中,然后您立即只调用一次,这简直是不必要的代码。

评论

1赞 Ed Morton 10/26/2023
sed -i 's|mnt="[^"]*"|mnt="'"$newdir"'"|' file如果将来增强,可以说会更清晰,更不容易出错,因为它只会向 shell 公开必须暴露给 shell 的最小部分(即扩展变量),同时仍然保护脚本的其余部分。
0赞 rhadamanthe 10/28/2023
我可以在包含“sed”的行上有例外吗?
0赞 tripleee 10/28/2023
如果您打算不对这些行执行替换,则 ;但请不要在评论中堆积新要求。根据你的实际需求提出一个新问题(但可能先搜索,并在问题中提及你自己的努力,并解释为什么你找到的相关解决方案不符合重复条件 - 这是一个相当常见的常见问题解答)。sed -i '/sed/!s...'
0赞 rhadamanthe 10/29/2023
对不起,没有那么多时间来尝试这些代码,并编辑我的帖子
0赞 rhadamanthe 10/29/2023
我回家后会做的
1赞 Ivan 10/26/2023 #2

IMO的西装比指挥更好,试试这个:cseds

#!/bin/bash

scr=$(basename "$0")
new='"/tmp/dir2"'
mnt="/tmp/dir1"

echo "$scr $mnt"
sed -i '/mnt=/cmnt='"$new" "$scr"
0赞 Walter A 10/26/2023 #3

看起来你想改变一条线,比如

mnt=/some/path/file

mnt=/okl/dfsdf/dfsf/file

你可以使用

newdir="/okl/dfsdf/dfsf/"
sed -i 's|mnt=.*/|mnt='$newdir'|' file

评论

0赞 rhadamanthe 10/28/2023
问题是该命令是在“file”中完成的,因此它更改了 sed 参数,因为它编写了 mnt=
0赞 Walter A 10/28/2023
当命令位于您尝试更改的文件中时,您创造了一个奇怪的情况。你可以通过告诉它不应该(即)替换任何以(即)开头的东西来解决它。命令是 。sedsed!sed/^sed/sed -i '/^sed /!s|mnt=.*/|mnt='$newdir'|' file
0赞 rhadamanthe 10/29/2023
它可能会起作用,我会尝试的,非常感谢
0赞 Walter A 10/29/2023
选中后,查看 stackoverflow.com/help/someone-answers