【问题标题】:File character matching and adding a character shell script文件字符匹配和添加字符shell脚本
【发布时间】:2020-07-30 12:07:05
【问题描述】:

我有一个格式如下的文件

ABD|66732|987|01/06/2019 10:00|I
ABD|66732|927|01/06/2019 10:01|I
ABD|66732|W917|01/06/2019 10:02|I
ABD|66732|947|01/06/2019 10:03|I
ABD|66732|W977|01/06/2019 10:04|I
ABD|66732|997|01/06/2019 10:05|I

我想在第二个 '|' 之后加上前缀 'W'如果 W 不存在,则在每一行上。我需要使用 bash 脚本来执行此操作。 我尝试使用 sed 并且可以替换,但是如何使用 sed 有条件地替换?

【问题讨论】:

  • I tried using sed and I am able replace 请点击edit 将该代码添加到问题中
  • 请将该示例输入的所需输出(无描述)添加到您的问题(无评论)。

标签: regex shell sed


【解决方案1】:

awk 更适合基于字段的处理:

$ awk 'BEGIN{FS=OFS="|"} {sub(/^[^W]/, "W&", $3)} 1' ip.txt
ABD|66732|W987|01/06/2019 10:00|I
ABD|66732|W927|01/06/2019 10:01|I
ABD|66732|W917|01/06/2019 10:02|I
ABD|66732|W947|01/06/2019 10:03|I
ABD|66732|W977|01/06/2019 10:04|I
ABD|66732|W997|01/06/2019 10:05|I
  • BEGIN{FS=OFS="|"} 设置| 为输入输出字段分隔符
  • sub(/^[^W]/, "W&", $3) 仅搜索并替换第三个字段的第一个匹配项
    • ^[^W] 仅在第三个字段的第一个字符不是 W 时才有效
    • W& 添加 W 作为匹配字符的前缀

【讨论】:

    【解决方案2】:

    您可以使用以下模式:

    ^(([^|]+\|){2})([^W])
    

    并替换为:

    \1W\3
    

    Regex demo.

    【讨论】:

    • cli工具请不要使用regex101之类的网站,sed不支持非捕获组等功能
    • @Sundeep 谢谢,我不知道。更新的模式现在可以在 sed 中使用吗?还是我应该完全删除答案?
    • BRE/ERE differences,所以你需要sed -E 's/^(([^|]+\|){2})([^W])/\1W\3/'
    • 不,不会。 sed 使用 posix 基本正则表达式。
    • 感谢@Sundeep sed -E 's/^(([^|]+\|){2})([^W])/\1W\3/' 工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 2021-02-12
    • 2011-01-20
    相关资源
    最近更新 更多