查找字符串并替换为 SUBSTRING

查找字符串并替换为 SUBSTRING

我有这样的文件。例如(测试.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,并将其替换为$$STATEand 第一个子表达式\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=,然后将 后面的任何内容替换=为空格之前的第一位,再次插入单引号。

相关内容