提问人:rhadamanthe 提问时间:10/25/2023 最后编辑:tripleeerhadamanthe 更新时间:10/29/2023 访问量:84
将 sed 与变量、双引号、路径一起使用
Use sed with variable, double quote, path
问:
我正在尝试使用 .
该变量是对我要修改的路径的引用。sed
是否可以在下次启动时修改此脚本的文件中使用?sed
我试过了:
#!/bin/bash
main () {
newdir="/okl/dfsdf/dfsf/"
sed -i "s|mnt="/*/"|mnt="\$newdir"|g" file
}
main
我希望变量会改变,但只是在代码中第一次定义它时,这就是我需要双引号的原因。mnt
mnt="/*/"
答:
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的西装比指挥更好,试试这个:c
sed
s
#!/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
当命令位于您尝试更改的文件中时,您创造了一个奇怪的情况。你可以通过告诉它不应该(即)替换任何以(即)开头的东西来解决它。命令是 。sed
sed
!
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
评论
"foo"'bar'"baz"
foo
bar
baz
set -vx at the top of 'main
set +vx
+
sed