【问题标题】:SED Ends with does not work with string indexSED Ends with 不适用于字符串索引
【发布时间】:2017-04-19 23:13:19
【问题描述】:

示例输入是:

 3 TT 00670101J12SEP1629OCT16     6  OTP08100810+0300  DXB14351435+04001 73WCDIOYBMUKRHGLQNTVSEX     XX                                                           M                              00468673
"7518,32S,CDIYBMULKRQHTVNSE," | sed "s/$,\{9\}\(.\{3\}\).*/\1,&/" 

需要的样本输出是

7518,32S,CDIYBMULKRQHTVNSE,C

如果 170 以后的字符不存在..

7518 是行号。它已经开发了,但我正在研究一个额外的要求,即如果存在 170 以后的字符,则在逗号之后添加到行尾,否则从前一个标记中获取第一个字符。

【问题讨论】:

  • $ 是一个元字符,表示模式空间的结束,如果它是模式中的最后一个字符。在其他任何地方,它都是文字 $。在某些版本的 sed 中,当模式的最后一部分合乎逻辑时,它也将是模式空间的结尾,即:abc\($\|def\)
  • 真正的查询是这样的: sed '/./=' MYTXTFILE.txt | sed '/./N; s/\n/ /' | sed -ne 's/ 3\s.\{70\}(.\{3\})(.\{25\}).\{72\}(.\{15\}).*/\, \ \1,\2,\3 /p'|sed -e 's/\s//g' -e 's/VV/,V/g' 我想改变这个,如果我们没有第四个标记和第三个标记以逗号结尾,我应该从 MYTXTFILE.txt 中提取一个子字符串,比如从文件的第 5 到第 10 列索引并将其放在最后。
  • 以下工作正常,除了我用“test”替换结尾: sed '/./=' RO.txt | sed '/./N; s/\n/ /' | sed -ne 's/ 3\s.\{70\}(.\{3\})(.\{25\}).\{72\}(.\{15\}).*/\, \ \1,\2,\3 /p'|sed -e 's/\s//g' -e 's/VV/,V/g' -e 's/,$/,test/g'但是,如果我用 MYTXTFILE.txt 的第 5 个索引到第 10 个索引的子字符串替换 test,这不起作用..
  • 您能否使用RO.txt 的内容和您的预期输出来编辑您的问题?

标签: linux shell sed scripting


【解决方案1】:
sed -r 's/(^.*,)(.{3})(.*)/\1\2\3\2/g' <<< "7518,32S,CDIYBMULKRQHTVNSE,"
7518,32S,CDIYBMULKRQHTVNSE,CDI

如果您想保留双引号,请关注:

sed -r 's/(^.*,)(.{3})(.*)/"\1\2\3\2"/g' <<< "7518,32S,CDIYBMULKRQHTVNSE,"
"7518,32S,CDIYBMULKRQHTVNSE,CDI"

【讨论】:

    【解决方案2】:

    这样的事情可能会奏效:

    $ sed 's/,\(...\)[^,]*/&,\1/2' input.txt
    7518,32S,CDIYBMULKRQHTVNSE,CDI,
    

    它将替换,的第二个匹配后跟三个字符:

    7518,32S,CDIYBMULKRQHTVNSE,
    #       ^^^^^^^^^^^^^^^^^^
    #       ||||             ^ End of match
    #       |^^^ Captured in \1
    #       ^ Start of match 
    

    【讨论】:

      猜你喜欢
      • 2012-07-25
      • 2021-10-30
      • 2017-10-28
      • 1970-01-01
      • 2019-02-07
      • 2022-08-17
      • 2011-10-20
      • 2017-01-06
      • 2019-12-12
      相关资源
      最近更新 更多