このようなファイルがあります。はい(test.txt)
$$BATCHCTRL=TEST-012017
$$STATE=CA AZ
$$FROM_DATE=01/10/2017
$$TO_DATE=01/30/2017
私がしなければなら$$STATE=CA AZ
ないのは、これを値の最初の2バイトに置き換えることだけです。つまり(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で始まる行を一致させ、それをandの最初のサブ式$$STATE=AB CD
に置き換えます。$$STATE
\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
これは、ファイルを=
区切られたフィールドのコレクションに解析するために使用されます。最初のフィールドが正しい文字列の場合、$$STATE
2番目のフィールドはスペースで区切られ、一重引用符で囲まれた最初のスペースで区切られたビット値が割り当てられます。
ファンキーな外観は、"'"'"'"
一重引用符で囲まれたスクリプトの二重引用符一重引用符文字ですawk
。
結果は次のとおりです。
$$BATCHCTRL=TEST-012017
$$STATE='CA'
$$FROM_DATE=01/10/2017
$$TO_DATE=01/30/2017
または以下を使用してくださいsed
。
sed -E '/^\$\$STATE=/s/=([^ ]*).*/='"'"'\1'"'"'/' file
これにより、文字列で始まる行を見つけ、$$STATE=
その後のすべての行を=
スペースの前の最初のビットに置き換えて、二重引用符を挿入します。