【问题标题】:Extract the matched regex or delete strings other than the matched regex提取匹配的正则表达式或删除匹配的正则表达式以外的字符串
【发布时间】:2012-09-19 02:10:03
【问题描述】:

我有一个文件

**data2.l**
I have a car 
its nissan GTR 
this car is super fast

如果我想从这个文件中删除“汽车”这个词,我只是使用

perl -p -i -e "s/car//ig" data2.l

但如果我想保留“汽车”并删除“汽车”以外的所有其他术语 如果我尝试只提取“汽车”,我只能提取包含“汽车”的完整行。

**example O/P**
car
car

那么可以稍微修改一下这个单行代码来完成这项任务吗?

【问题讨论】:

  • 如果“汽车”一词在每一行出现多次怎么办?你希望你的输出是什么?
  • 打印两个时间。不管它重复多少次,我只想提取那个词。

标签: regex perl extract


【解决方案1】:

如果“汽车”一词在每一行出现多次,这将按字面意思打印两次,并添加一个换行符结尾:

grep -io "car" file.txt

输入:

i have a car 
its nissan GTR 
this car is super fast Car

输出:

car
car
Car

更新:

grep -ioP "car[^ ]*" file.txt

输入:

i have a car 
its nissan GTR 
this car123 is super fast Car

输出:

car
car123
Car

【讨论】:

  • 感谢@steve 的快速响应。我试图从您的解决方案的编辑输入中获取编辑后的输出。但我没有成功。那么我该如何修改以获得如您的解决方案中所示的输出。 IE。如果我在文件中有car123,我想提取它以及car123。我该怎么做
  • @unkaitha:请查看更新。它使用 Perl 正则表达式引擎来匹配单词 car 及其后面的任何内容,只要它不是空格即可。
【解决方案2】:

这个 Perl 做了类似的事情,但是同一行上的所有“汽车”都保持在同一行上:

  perl -lne 'print join " ", /car\S*/ig if /car/i'

你从史蒂夫的例子​​中得到这个输出:

car
car123 Car

【讨论】:

  • 感谢@Mark 的解决方案。我试图修改您的解决方案以获取输出为“car123”,如果它们存在名称为“car123”的字符串。我只能设法提取整行。但不仅仅是那个“car123”
  • 不确定我是否理解。所以如果有一个单词包含“汽车”作为它的一部分,你想要整个单词打印出来吗?不只是字符串“car”,而不是整行?
  • 是的,我想打印整个单词而不是整行
  • @steve 谢谢。用 perl 非空白表达式 \S 替换了否定的 char 类。
【解决方案3】:

我玩得很开心。所有这些选项只会打印 car 一次,即使它在文件中出现多次。

more data2.1 | grep -q 'car' && echo 'car'

more dara2.1 | sed -n 'h;N;$x;$s/.*car.*/car/p'

perl -ne '$i=1 if ~~/car/}{print "car\n" if $i' data2.1

【讨论】:

  • 经过进一步检查,我提供给您的似乎不是您想要的。不过perl -ne '@i = m/(car\S*)/g;$,="\n";print @i;print"\n"if@i' data2.1 会做到的。
猜你喜欢
  • 1970-01-01
  • 2022-10-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
  • 2012-06-05
  • 2013-12-25
相关资源
最近更新 更多