【问题标题】:Command to replace data in the nth column if the line begins with pattern如果行以模式开头,则替换第 n 列中的数据的命令
【发布时间】:2018-07-10 14:20:18
【问题描述】:

我有一个如下所示的文件:

16815966|Mr|Fit 5|Dont Usee|15-07-2015|||||||||||||0|2|0|0.00|0|  
21875307|Mr|Father|Dont Remove|X|31-12-1899|||||||||||||0|118|0|0.00|0|
19180802|Mr|Dontye|Harr|01-01-1900|||||6666|Avenue||||||06-09-2013|0|26|2|396.00|1|   

如果以“Dont”开头并且模式如 Dont Remove,Dont Use,我想用空白替换第 4 列值。但如果它像第三个例子中的一个,我想保留它。

期望的结果:

16815966|Mr|Fit 5||15-07-2015|||||||||||||0|2|0|0.00|0|  
21875307|Mr|Father||X|31-12-1899|||||||||||||0|118|0|0.00|0|
19180802|Mr|Dontye|Harr|01-01-1900|||||6666|Avenue||||||06-09-2013|0|26|2|396.00|1|    

在下面尝试过,一个用 awk 但没有运气!! sed '/^Dont/s/[^|]*//4'.

【问题讨论】:

  • 您应该只使用正确的 awk。提示$4 ~ /^Dont/ 可能会起作用。

标签: regex unix awk sed


【解决方案1】:

关注awk 可能对您有所帮助。

awk -F"|" '$4~/^Dont/{$4=""} 1' OFS="|"  Input_file

输出如下。

16815966|Mr|Fit 5||15-07-2015|||||||||||||0|2|0|0.00|0|
21875307|Mr|Father||X|31-12-1899|||||||||||||0|118|0|0.00|0|

【讨论】:

  • 工作谢谢 :)
  • 如何匹配(Dd)on't,即正确的英语?也许'$4~/^[dD]on'"'"'?t/{$4=""} 1';-)
  • 此外,如果它与示例 3 中的值类似,我想保留该值。有什么建议吗?
  • @sjsam,我们当然可以。我只是去回答 OP 的问题。
【解决方案2】:

PHP 解决方案。

正则表达式(?m)^(?:[\w ]+\|){3}\K(?:(Dont))(?(1)[^\|]+) 替换""空字符串。

$text = '16815966|Mr|Fit 5|Dont Usee|15-07-2015|||||||||||||0|2|0|0.00|0|  
         21875307|Mr|Father|Dont Remove|X|31-12-1899|||||||||||||0|118|0|0.00|0|
         19180802|Mr|Dontye|Harr|01-01-1900|||||6666|Avenue||||||06-09-2013|0|26|2|396.00|1|';

$text = preg_replace('/(?m)^(?:[\w ]+\|){3}\K(?:(Dont))(?(1)[^\|]+)/', "",$text);
print_r($text);

输出

16815966|Mr|Fit 5||15-07-2015|||||||||||||0|2|0|0.00|0|  
21875307|Mr|Father||X|31-12-1899|||||||||||||0|118|0|0.00|0|
19180802|Mr|Dontye|Harr|01-01-1900|||||6666|Avenue||||||06-09-2013|0|26|2|396.00|1|

Regex demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 2013-09-12
    相关资源
    最近更新 更多