이런 파일이 있습니다. 예(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
두 번째 필드는 공백으로 구분되며 작은따옴표로 묶인 첫 번째 공백으로 구분된 비트 값이 할당됩니다.
펑키한 모양 "'"'"'"
은 작은따옴표로 묶인 스크립트의 큰따옴표 작은따옴표 문자입니다 awk
.
결과는 다음과 같습니다
$$BATCHCTRL=TEST-012017
$$STATE='CA'
$$FROM_DATE=01/10/2017
$$TO_DATE=01/30/2017
또는 다음을 사용하십시오 sed
.
sed -E '/^\$\$STATE=/s/=([^ ]*).*/='"'"'\1'"'"'/' file
이렇게 하면 string 으로 시작하는 줄을 찾은 다음 $$STATE=
그 뒤에 오는 모든 줄을 =
공백 앞의 첫 번째 비트로 바꾸고 다시 작은따옴표를 삽입합니다.