如何使用shell脚本读取和替换固定长度文件中的特殊字符

时间:2013-11-13 10:59:34

标签: shell utf-8 sed

我有一个固定长度的文件,其中一些记录有不同的特殊字符,如Еӏєпа

我可以选择包含特殊字符/.

的记录

我想从这些记录中读取2列并使用'*'填充空白

进行更新

示例数据:

1234562013-09-01 01:05:30Еӏєпа   Нцвѡі      A other    
5657812011-05-05 02:34:56abu     jaya       B other

具体来说,包含特殊字符的第3和第4列应替换为用空格填充的单个'*'来填充长度

我需要结果如下

1234562013-09-01 01:05:30*       *          A2013-09-01 02:03:40other    
5657812011-05-05 02:34:56abu     jaya       B2013-09-01 07:06:10other

尝试以下命令:

sed -r "s/^(.{56}).{510}/\1$PAD/g;s/^(.{511}).{1023}/\1$PAD/g" errorline.txt  

cut -c 57-568 

有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

我会选择awk,例如:

awk '/[LIST__OF_SPECIAL_CHARS]/ {
       l=$0
       # for 3rd col
       # NOTE the * must be padded if you have a fixed length file
       # This can be done with spaces and/or (s)printf, read the docs 
       if (substr($0,FROM,NUM_OF_CHARS) ~ /[LIST__OF_SPECIAL_CHARS]/) {
        l=substr(l,1,START_OF_3RD_COL_MINUS_1) "*" substr(l,START_OF_4TH_COL) 
       } 
       # for 4th col
       # NOTE the * must be padded if you have a fixed length file
       # This can be done with spaces and/or (s)printf, read the docs 
       if (substr($0,START_OF_4TH_COL,NUM_OF_CHARS) ~ /[LIST__OF_SPECIAL_CHARS]/) {
        l=substr(l,1,START_OF_4TH_COL_MINUS_1) "*" substr(l,END_OF_4TH_COL_PLUS_1) 
       }
       # after printing this line, skip to next record.
       print l
       next
     }
     { # prints every other record
       print }' INPUTFILE

答案 1 :(得分:0)

sed "/.\{56\}.*[^a-zA-Z0-9 ].*.\{7\}/ s/\(.\{56\}\).\{20\}\(.\{7\}\)/\1*       *    \2/"errorline.txt

其中:

  • 56是您的第一部分,不包含特殊字符
  • 20是第二部分taht包含可能特殊的字符
  • 7是你的字符串的最后一部分。
  • "* * "是将替换您的特殊字符部分的字符串。

将这些值调整为字符串结构

这个sed读取所有文件并仅替换带有特殊字符的行。