替换文件定界部分中的字符

时间:2018-08-01 19:29:03

标签: unix sed replace character

我有一个文件Function listWeekday(dt As Long, ndx As Long, _ Optional wd As Long = 6) listWeekday = 7 - Weekday(DateSerial(Year(dt), Month(dt), 0), wd) + _ DateSerial(Year(dt), Month(dt), 1) + _ (ndx - 1) * 7 If Month(dt) <> Month(listWeekday) Then _ listWeekday = CVErr(xlErrNA) End Function 'usage for Fridays in current month =listWeekday(today(), row(1:1)) 'usage for Sundays in current month =listWeekday(today(), row(1:1), 1) 'usage for Wednesdays in current month =listWeekday(today(), row(1:1), 4) ,内容如下:

teste.txt

我执行命令

02183101399205000 GBTD9VBYMBQ 04455927964
02183101409310000 XBQMPL1C93B 27699484827
54183101003651000 1WFG3SNVDG9 71530894204

结果是:

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

仅第3行中的第19位从02183101399205000 GBTD9VBYMBQ 04455927964 02183101409310000 XBQMPL1C93B 27699484827 54183101003651000 #WFG3SNVDG9 71530894204 更改为1

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

预期结果是:

#

2 个答案:

答案 0 :(得分:1)

用于完成目标的awk命令:

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

答案 1 :(得分:0)

这可能对您有用(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的字符用换行符括起来并进行复制。将所有数字替换为#。将此字符串附加到原始字符串上,并使用模式匹配对字符串进行重新排列,以形成一个新字符串,在更改部分的两边都具有未更改的部分,同时丢弃引入的换行符。

一种替代方法,利用字段之间用空格分隔的事实:

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