我有一个固定长度的数据文件,其中记录被标记(前 6 个字符具有标识记录的特定字符串),并且我需要替换特定行和该行上特定位置的文本。
HEADER 123456
SHIPTO CODE 123 LANE HOUSTON TX
ITEM ACME BRICK
例如,我想替换上述数据中的发货地址代码。数据可以在收货方记录的位置 10-17 中找到(以“SHIPTO”开头的行)。我想使用 sed 或 awk (或其他命令),但使用单个命令行更新数据。如果有多个 SHIPTO 线路,我可以全部更新。
答案1
使用 sed:
$ sed -E '/^SHIPTO/ s/(.{9}).{8}/\1NuValue /' file
HEADER 123456
SHIPTO NuValue 123 LANE HOUSTON TX
ITEM ACME BRICK
怎么运行的:
/^SHIPTO/
这将选择以以下开头的行
SHIPTO
。这代替接下来的命令将仅应用于这些行。s/(.{9}).{8}/\1NuValue /
这将匹配该行的前 9+8 个字符,并将该行的前 9 个字符保存在组 1 中。这些字符将替换为组 1、
\1
和您的新值(为了保持格式,应为 8 个字符。
答案2
给定输入文件:
HEADER 123456
SHIPTO CODE 123 LANE HOUSTON TX
ITEM ACME BRICK
并希望更改“代码”后的字段,其中第一个字段是“SHIPTO”:
$ awk 'BEGIN { OFS = "\t" } $1 != "SHIPTO" { print } $1 == "SHIPTO" { $3="0000"; print }' input
HEADER 123456
SHIPTO CODE 0000 LANE HOUSTON TX
ITEM ACME BRICK
如果您的字段是固定长度且以空格分隔且不是制表符分隔,则可以使用格式化的打印字符串(例如printf( "%20s\t" "$1" )
)。