![两个字符串之间的切片(电子邮件+单词)](https://linux22.com/image/138890/%E4%B8%A4%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B9%8B%E9%97%B4%E7%9A%84%E5%88%87%E7%89%87%EF%BC%88%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6%2B%E5%8D%95%E8%AF%8D%EF%BC%89.png)
我需要一种方法在电子邮件出现之后和某些文本出现之前对所有内容进行切片。
示例格式如下所示:
[email protected]:0:3rw3e:weofkew:StackOverflow=
[email protected]:19.2132.1:StackOverflow=
所需的格式为:
[email protected]:StackOverflow= (followded by everything else on the line).
因此,本质上是在电子邮件出现之后和StackOverflow=
出现之前进行切片。
注意:所有电子邮件都是唯一的,并非字面上的意思[email protected]
答案1
sed -r 's/(@[^:]+:).*(StackOverflow=)/\1\2/' input.txt
解释
sed -r 's/foo/bar/' input.txt
:将 sed 与扩展正则表达式结合使用,将file 的模式替换foo
为, 。bar
input.txt
(@[^:]+:).*(StackOverflow=)
:匹配@
电子邮件地址中的 ,后跟 1 个或多个非:
字符 ([^:]+
)。然后是一个:
.使用 的第一个捕获组捕获这一切()
。接下来是一些字符.*
,StackOverflow=
我们也将其捕获为一组()
。/1/2
:将此表达式替换为部分电子邮件地址(上面的第一个捕获组),跳过中间的部分,然后是第二个捕获组。
注意,这对输入文件的格式做出了很多假设,例如电子邮件地址的格式、行数@
和StackOverflow=
每行数等。