【问题标题】:Replace characters in a delimited part of a file替换文件分隔部分中的字符
【发布时间】:2019-01-09 11:29:45
【问题描述】:

我有文件teste.txt,内容如下:

02183101399205000 GBTD9VBYMBQ 04455927964
02183101409310000 XBQMPL1C93B 27699484827
54183101003651000 1WFG3SNVDG9 71530894204

我执行命令

sed -e 's/^\(.\{18\}\)[0-9]/\1#/g' teste.txt

结果是:

02183101399205000 GBTD9VBYMBQ 04455927964
02183101409310000 XBQMPL1C93B 27699484827
54183101003651000 #WFG3SNVDG9 71530894204

只有第 3 行中的第 19 位从 1 更改为 #

我想知道如何将所有数字字符从第 19 位更改为第 30 位。

预期结果是:

02183101399205000 GBTD#VBYMBQ 04455927964
02183101409310000 XBQMPL#C##B 27699484827
54183101003651000 #WFG#SNVDG# 71530894204

【问题讨论】:

  • Sed 正在执行您的模式所要求的操作 - 在一行的开头查找 18 个字符,然后紧跟一个数字字符。 awk 将是完成这项工作的更好工具。

标签: unix sed replace character


【解决方案1】:

实现目标的 awk 命令:

awk '{ gsub(/[0-9]/,"#",$2); print }' teste.txt

【讨论】:

    【解决方案2】:

    这可能对你有用(GNU sed):

    sed -r 's/./&\n/30;s//\n&/19;h;s/[0-9]/#/g;H;x;s/\n.*\n(.*)\n.*\n(.*)\n.*/\2\1/' file
    

    用换行符将字符串的第 19 到第 30 个字符括起来并进行复制。用#'s 替换所有数字。将此字符串附加到原始字符串并使用模式匹配重新排列字符串以创建一个新字符串,其中更改部分两侧的未更改部分,同时丢弃引入的换行符。

    另一种方法,利用字段是空格分隔的事实:

    sed -r ':a;s/( \S*)[0-9](\S* )/\1#\2/;ta' file
    

    其实这两种方法可以结合使用:

    sed -r 's/./&\n/30;s//\n&/19;:a;s/(\n.*)[0-9](.*\n)/\1#\2/;ta;s/\n//g' file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-04
      • 1970-01-01
      • 2018-09-07
      • 1970-01-01
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      • 2017-08-30
      相关资源
      最近更新 更多