sed 및 awk를 사용하여 검색 값과 일치하는 행(파일에서)의 모든 마지막(공백으로 구분된) 필드를 검색하는 방법이 있습니까(문자열이 마지막 필드 앞의 필드에서 일치하더라도 건드리지 않습니다) 다른 필드) 검색 값을 다른 것으로 변경할 수 있나요?
210983342900 342832423-1 i2301rw1900 309212dw90 900
9328423ABC 32091840-943543-9435 3012=32193900 301 3029432 334
210983342900ABCDE 342832423-1 i2301rw1900 309212dw90 900
9328423 32091840-943ABC3-9435 3012=32193900 301 3029432 ABC
3843209898 48435843098543098543 43985439859209438543 499 ABC
따라서 모든 마지막 필드에서 ABC를 검색하고 발견된 모든 값을 DEFG로 변경하거나 모든 마지막 필드에서 900을 검색하여 000으로 변경합니다.
문제를 분석하고 해결책을 설명해 주실 수 있나요?
답변1
echo 'This is terrible, I feel terrible' | awk '{if ($NF~"^terri") $NF="good"; print}'
이것은 트릭을 할 것입니다.
$NF
위치에 있는 필드입니다 NF
. 다음은 awk
필드 수이므로 마지막 필드입니다.
$NF~"^terri"
~
정규 표현식과 일치시키는 데 사용됩니다 . ==
이는 정확한 일치를 원하는 경우에 작동합니다.
$NF="good"
필드는 대체되지만 if
조건이 충족되는 경우에만 가능합니다.
마지막으로 print
전체 기록을 인쇄합니다.
echo '
210983342900 342832423-1 i2301rw1900 309212dw90 900
9328423ABC 32091840-943543-9435 3012=32193900 301 3029432 334
210983342900ABCDE 342832423-1 i2301rw1900 309212dw90 900
9328423 32091840-943ABC3-9435 3012=32193900 301 3029432 ABC
3843209898 48435843098543098543 43985439859209438543 499 ABC
' | awk '{if ($NF=="ABC") $NF="DEFG"; print}'
답변2
그리고 sed
:
sed -E 's/([[:blank:]]+)ABC$/\1whatever/' infile
-E
여기 에서도(
Escape 할 필요가 없도록 확장 정규식을 활성화합니다 .)
+
[:blank:]
공백이나 탭만 일치[[:blank:]]
정규식의 문자 클래스는 문자 목록의 괄호 안에만 유효합니다.[[:blank:]]+
하나 이상의 공백 또는 탭과 일치(...)
괄호는 그룹 일치를 생성하고 첫 번째 그룹 , 세 번째 그룹 및 최대 9번째 그룹\1
에 대한 역참조 역할을 합니다 . 그룹 일치는 하나만 정의했습니다.\2
\3
\9
ABC
ABC
문자열과 정확하게 일치합니다 .$
라인 앵커 포인트의 끝입니다교체 부분에서는 첫 번째 일치 항목 집합을 반환합니다 . 이는 문자열 로 대체될
\1
문자열 앞의 공백을 유지하는 데 사용됩니다 .ABC
whatever
마지막 필드를 다음으로 바꾸십시오 whatever
.
sed -E 's/([[:blank:]]+)[^[:blank:]]*$/\1whatever/' infile
^
괄호 안에 있는 것을 보셨나요 [^[:blank:]]
? 문자 클래스에서 처음 나타나는 경우 부정 문자이므로 지정된 문자 클래스는 공백이나 탭을 제외한 모든 문자와 일치합니다. 행이 후행 공백으로 끝나면 0개 이상의 문자라는 수량자를 사용하기 때문에 문자열이 행 whatever
끝에 추가됩니다 *
. 이런 일이 발생하지 않도록 하려면 [^[...]]*
다음으로 변경하세요.[^[:blank:]]+