【问题标题】:add a " once string matched using sed in multiple lines在多行中添加一个使用 sed 匹配的 " 一次字符串
【发布时间】:2017-11-16 06:30:32
【问题描述】:

当我尝试使用以下命令替换字符串时,所有字符串都被替换为 0。但是,我只需要替换以 0 开头的字符串和字母数字的组合。请帮助排除其他字符串.请在我使用的下面找到 sed 命令。

sed -r 's:((0\w+)):"&":g'  test >test.log

输入文件:测试

0INTEL  GC  P   0servername     0.000       0I30019     12/02/15
0INTEL  GC  P   0servername     0.000       0I30019     12/02/15

预期输出:test.log

"0INTEL"    GC  P   "0servername"   0.000       I30019      12/02/15
"0INTEL"    GC  P   "0servername"   0.000       I30019      12/02/15

实际输出:

"0INTEL"    GC  P   "0servername"   0."000"     I30019      12/"02"/15
"0INTEL"    GC  P   "0servername"   0."000"     I30019      12/"02"/15

【问题讨论】:

  • 看起来通过创建新帐户提出的问题有所不同。stackoverflow.com/questions/47298909/… 仍然不确定该问题中给出的答案有什么问题
  • 您好 sundeep,感谢您的检查,很简单,我需要排除以零开头的日期和特殊字符。同样的,我给出了我在使用上述命令时得到的实际输出......我希望你不能理解......

标签: bash sed


【解决方案1】:

awk。对于所有字段,如果字段匹配模式,请添加引号。最后打印该行(1 表示默认操作是打印行)

awk '{ for (i=1;i<=NF;i++) if ($i ~ /^0[A-Za-z0-9]*$/) $i="\""$i"\"" } 1' file

【讨论】:

    【解决方案2】:

    您的“预期输出”似乎有错误。由于某种原因,“0I30019”中的前导 0 已被删除。否则,您需要的是这样的:

    sed -r 's/((0[A-Za-z][A-Za-z0-9]*))/"&"/g' text
    

    根据您的示例,前导 0 之后的第一个字符应该是字母,但该单词之后可以包含数字字符。正则表达式反映了该要求。输出:

    "0INTEL" GC P "0servername" 0.000 "0I30019" 12/02/15 "0INTEL" GC P "0servername" 0.000 "0I30019" 12/02/15
    

    【讨论】:

    • 感谢您的关注,根据您的建议我更新了文件。
    【解决方案3】:

    只是另一个 awk 提议。

    awk '{sub(/0INTEL/,"\0420INTEL\042")sub(/0servername/,"\0420servername\042")}1' file
    
    "0INTEL"  GC  P   "0servername"     0.000       0I30019     12/02/15
    "0INTEL"  GC  P   "0servername"     0.000       0I30019     12/02/15
    

    【讨论】:

    • 感谢您的共享命令,以上是示例。主要问题是字符串(输入)是动态的,而不是静态的。但这将根据静态输入起作用...
    猜你喜欢
    • 2011-04-05
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多