V 友们,请教个提取两个字符串中的语句并加引号的 sed 写法

2022-11-03 23:30:12 +08:00
 maosu
举个栗子:
howdareyou

我想提取出 dare 这个单词并给这个单词两边加上单引号,如下
how'dare'you

最近在自学 sed 的正则表达式,实在搞不定,来请教一下万能的 V 友,谢谢啦~

很抱歉之前表述不太清楚,实际需求是 how 和 you 之间的语句是不确定的,需要提取这个不确定的语句并加上引号哈
1992 次点击
所在节点    Linux
9 条回复
wxf666
2022-11-03 23:32:50 +08:00
```shell
$ sed "s/dare/'&'/" <<<'howdareyou'
how'dare'you
```
iamzuoxinyu
2022-11-04 00:10:16 +08:00
一个快但可能不正确的方法:给 how 和 you 改成 how' 和 'you
yuanmomo
2022-11-04 03:28:43 +08:00
@iamzuoxinyu 跟你想到一块儿了
dcsuibian
2022-11-04 03:54:06 +08:00
sed 的正则表达式引擎比较弱
建议用 awk ,有扩展的正则表达式引擎。

其中对应你这个问题就是 group 分组和引用功能
aijam
2022-11-04 07:50:06 +08:00
> echo howdareyou | sed -r "s/how(.+)you/how'\1'you/"
how'dare'you
huntagain2008
2022-11-04 08:57:58 +08:00
#5 /how(.+)you/ 可能用的是“.“,跟用字母[a-zA-Z]匹配的结果完全不同 。当字符串很长,中间有一些干扰项,比如前面中间都有 how 、you ,结尾是 you ,中间明明是可以匹配好几个 how*****you 的,但是只匹配了第一个 how 和最后一个 you ,中间的各种 how****you 都没有打上引号,只给第一个 how 和最后一个 you 打了引号。
maosu
2022-11-04 09:12:37 +08:00
@aijam
@huntagain2008
感谢感谢,两位写的都很好哈,我也发现了这个问题,/how(.+)you/只给头尾匹配的 how you 前加上了引号,还不太清楚怎么处理哈
huntagain2008
2022-11-04 09:22:53 +08:00
#2 how->how‘ you->‘you 这种还清楚点,小白我就是这样想的。

awk 有内置的 gsub 函数可以全局替换匹配项

# howxxxyou.awk
#
{
value = $0
gsub(/how/, "&'", value)
gsub(/you/, "'&", value)
print value
}
aloxaf
2022-11-05 17:48:04 +08:00
@maosu #7 sed 不支持非贪婪,用 perl 吧

❯ echo howareyouhowareyou | perl -pe "s/how(.+?)you/how'\1'you/g"
how'are'youhow'are'you

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/892505

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX