sed는 줄의 마지막 필드를 검색하고 바꿉니다.

sed는 줄의 마지막 필드를 검색하고 바꿉니다.

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

  • ABCABC문자열과 정확하게 일치합니다 .

  • $라인 앵커 포인트의 끝입니다

  • 교체 부분에서는 첫 번째 일치 항목 집합을 반환합니다 . 이는 문자열 로 대체될 \1문자열 앞의 공백을 유지하는 데 사용됩니다 .ABCwhatever


마지막 필드를 다음으로 바꾸십시오 whatever.

sed -E 's/([[:blank:]]+)[^[:blank:]]*$/\1whatever/' infile

^괄호 안에 있는 것을 보셨나요 [^[:blank:]]? 문자 클래스에서 처음 나타나는 경우 부정 문자이므로 지정된 문자 클래스는 공백이나 탭을 제외한 모든 문자와 일치합니다. 행이 후행 공백으로 끝나면 0개 이상의 문자라는 수량자를 사용하기 때문에 문자열이 행 whatever끝에 추가됩니다 *. 이런 일이 발생하지 않도록 하려면 [^[...]]*다음으로 변경하세요.[^[:blank:]]+

관련 정보