![如何删除句子末尾“at”后面的文字?](https://linux22.com/image/211895/%E5%A6%82%E4%BD%95%E5%88%A0%E9%99%A4%E5%8F%A5%E5%AD%90%E6%9C%AB%E5%B0%BE%E2%80%9Cat%E2%80%9D%E5%90%8E%E9%9D%A2%E7%9A%84%E6%96%87%E5%AD%97%EF%BC%9F.png)
我有一个大数据,正在寻找一个grep
命令来删除文本并保留这句话上的职位名称,我已经使用这个 grep 命令^.*?at
来获取单词后的公司名称at
,但这次我想保留他们的职位名称,该grep
命令我应该使用吗?
CEO at Insurance Menu
Founder & CEO at insurtech
AVP, Alliances and Analyst Relations at ValueMomentum
AGV-President at Aflac Ventures
例如第一行的最终结果应该是CEO
,从单词中删除整个文本at Insurance Menu
我正在使用 BBEDIT(查找并替换全部)功能。
答案1
更新在对问题的编辑中,详细说明了要使用 BBEdit 的“查找和替换”选项。这在某种程度上使得这个答案中提出的原始解决方案无效。
为了删除at
使用 BBEdit 的“查找和替换”功能之后的文本,您可以利用替换文本可以包含对(...)
搜索模式的封闭子模式的反向引用这一事实。因此,为了您的目的,您可以使用
(.*) at .*
作为寻找模式(Grep
启用选项),以便 之前的所有内容at
都存储在“捕获组”中,并且
\1
这只是“捕获组”的内容,如代替文本。这sed
与下面答案的原始版本中提出的解决方案基本相同。
原答案
我们假设您的输入文件名为contact-details.txt
.
一种方法可能是使用sed
,如下所示
sed -E 's/(.*) at .*/\1/' contact-details.txt
这使用 ERE(为了方便)和捕获组s
仅用括号中的部分(第一个捕获组,表示为 )替换(替换)整行,这是该行\1
(最后一个)之前的文本。at
它假设 只出现一次at
。
对于您的输入示例,输出将是:
CEO
Founder & CEO
AVP, Alliances and Analyst Relations
AGV-President
另一种方法是使用grep
withPerl 兼容的正则表达式启用语法和“积极的前瞻”:
grep -Po '.*(?= at )' contact-details.txt
这将匹配之前出现的任何文本at
,并且感谢该-o
选项仅有的打印该文本,从而丢弃at
以及之后的任何内容。它具有相同的限制,即线路上必须只有一个at
才能工作。
答案2
at
要删除两侧各有一个空格的单词及其后的所有内容:
sed 's/ at .*//' file1.txt
给定示例文本,这将产生
CEO
Founder & CEO
AVP, Alliances and Analyst Relations
AGV-President