我有这样的文件。例如(测试.txt)
$$BATCHCTRL=TEST-012017
$$STATE=CA AZ
$$FROM_DATE=01/10/2017
$$TO_DATE=01/30/2017
我需要做的就是$$STATE=CA AZ
用该值的前两个字节替换它。 IE(CA
)。
输出文件应该是
$$BATCHCTRL=TEST-012017
$$STATE=CA
$$FROM_DATE=01/10/2017
$$TO_DATE=01/30/2017
答案1
我假设这对角色STATE
是在首都。如果没有,那么您应该更换[A-Z]
[A-Za-z]
。
您可以使用这个简单的命令:
sed -Ei 's/^\$\$STATE=([A-Z]{2}) ([A-Z]{2})/\$\$STATE=\1/g' sed_file
它将匹配以$$
like开头的行$$STATE=AB CD
,并将其替换为$$STATE
and 第一个子表达式\1
。
编辑:如果您想要额外的单引号,请使用:
sed -Ei 's/^\$\$STATE=([A-Z]{2}) ([A-Z]{2})/\$\$STATE='"'"'\1'"'"'/g' sed_file
答案2
awk 'BEGIN { FS=OFS="=" } $1 == "$$STATE" { split($2,a," "); $2 = "'"'"'" a[1] "'"'"'" } 1' file
这用于awk
将文件解析为=
- 分隔字段的集合。如果第一个字段是精确的 string $$STATE
,则第二个字段将按空格分割,并分配其第一个空格分隔位的值,并用单引号引起来。
时髦的外观"'"'"'"
是单引号脚本中的双引号单引号字符awk
。
结果将是
$$BATCHCTRL=TEST-012017
$$STATE='CA'
$$FROM_DATE=01/10/2017
$$TO_DATE=01/30/2017
或者,使用sed
:
sed -E '/^\$\$STATE=/s/=([^ ]*).*/='"'"'\1'"'"'/' file
这将找到以字符串开头的任何行$$STATE=
,然后将 后面的任何内容替换=
为空格之前的第一位,再次插入单引号。