【问题标题】:How to find and replace a regex pattern in Linux?如何在 Linux 中查找和替换正则表达式模式?
【发布时间】:2017-02-07 06:06:57
【问题描述】:

我正在尝试在脚本中查找和替换正则表达式模式。现有字符串将类似于

  Input Sample :  abc,c,efh,hj35,"2,6ag=a193",02_TG,",,,,10,,f,,",gf,g,f,,"1720a5",Thgf"18,dhg;_,2,53",0,hg,cj,cj
  Expected Output :  abc,c,efh,hj35,"-",02_TG,"-",gf,g,f,,"-",Thgf"-",0,hg,cj,cj

我的替换字符串如“-”。我尝试过的代码是

sed -e 's/".*"/"-"/g filename

但它不起作用!

【问题讨论】:

  • 你想要sed 's/,/-/g'这个吗?
  • 您的预期输出是什么?只有,需要改成-
  • @PrudhviPrasanth * 并不是你想的那样。
  • 示例输入中没有双引号,因此您拥有的正则表达式永远不会匹配。

标签: regex linux shell unix sed


【解决方案1】:

使用 perl:

perl -api -e 's/"[^"]*"/"-"/g' filename

【讨论】:

【解决方案2】:

如果您只想匹配一个字符,则不应使用* 星号,因为它是贪婪的,并且可以匹配尽可能多的字符。

所以你只需要s/,/-/ 就可以了。

但是,如果您想保留 beforeafter 的任何内容,则可以将它们存储在 ma​​tch-group 括号中,然后反向引用它们,如下所示:

s/(.*?),(.*?)/\1-\2/
或在某些搜索引擎中
s/(.*?),(.*?)/$1-$2/


注意
大多数 sed 实现不支持非贪婪的 (.*?)。你可以切换到支持它的 Perl


为您更新
输入
abc,c,efh,hj35,"2,6ag=a193",02_TG,",,,,10,,f,,",gf,g,f,,"1720a5",Thgf"18,dhg;_,2,53",0,hg,cj,cj

perl -pe 's/".*?"/"-"/g' your-file

输出
abc,c,efh,hj35,"-",02_TG,"-",gf,g,f,,"-",Thgf"-",0,hg,cj,cj

prove

【讨论】:

  • 大多数sed 实现不支持非贪婪(.*?)。您可以切换到支持它的 Perl,但这仍然不是完全健壮的,例如用于引号内带有逗号的 CSV 数据。
  • @tripleee,谢谢。是的你是对的。这个问题没有特定的目的,所以我一般都写了。那么如果问题是关于" 等,那么我的答案将是不同的答案。
  • @k-five 可能是我误解了自己。为此道歉。但我必须匹配双引号之间的所有字符。谢谢。
  • @PrudhviPrasanth 请更新您的问题,以便我知道您需要什么。如果我的回答对你没有用,那么告诉我,我会删除它。谢谢
  • @k-five 感谢您的帮助。我已经用示例输入和预期输出更新了问题。你能帮忙吗??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
  • 2016-04-21
  • 1970-01-01
  • 2012-06-06
  • 2015-03-25
相关资源
最近更新 更多