sed的正则表达式书写

想将字符串中的~替换为/home/user,想让它匹配~和~/xxx这两种情况,我写成:
echo “$d” | sed ‘s/^~([/$])//home/user\1/’
但[/$]无法匹配行末,怎么写能即匹配\又匹配行末?谢谢哈

它当然无法匹配到行末。你的正则是哪里学的啊……另外我不知道你为什么要匹配行末。

看了下,应该用(\/|$)的写法(也许是(\/\|$),具体我试试),就是$不应该认为是一个字符。[AB]匹配A或B的前提是AB都是字符。就是简单手动把~匹配为家目录,比如~/test/把~换成家目录,但是不应该匹配~SS/这种,但是单个~也要匹配,就是要匹配~后是/或者行末的。

哦。那 ~ 后是空格呢?

你要不用 Perl 吧,可以这样:

perl -pi -e 's/~(?!\w)/X/g

甚至这样:

perl -pi -e 's/(?<!\w)~(?!\w)/X/g

这种问题问gpt有奇效

1 个赞

多谢建议,不过我比较习惯shell^_^,试出了正确写法(进化了一点,自动替换为家目录):

reg=$(echo $HOME | sed -r 's/\//\\\//g')
dir=$(echo $dir | sed -r "s/^~(\/|$)/${reg}\1/")

如果你的字符串格式非常有限的话,sed 确实够用了。

你写那么多 \/ 不嫌累吗?sed 的 s 命令的分隔符可以换其它符号,比如 s=regex=replacement=