SED를 사용하여 캡처된 그룹 교체

SED를 사용하여 캡처된 그룹 교체

xxxxxx15 |xxxxxx02|RM99999 |xxxxxx |안쿠르|xxxxx |xxxxxxxx|M|xxxxxxxx|

10을 65로 바꾸고 싶어요. 옷장에 많아요sed -i '/^.\{20\}RM99999/ s/^\(?:[^|]*\|\)\{16\}\([^|]*\)/\165/' test.txt

하지만 첫 번째 문자를 65로 대체합니다(더 많은 위치에 있을 수 있지만 RM99999줄의 20번째 문자를 대체해야 함).RM99999

답변1

XY 문제인 것 같습니다.

awk를 사용해 보는 것은 어떨까요?

awk -F\| -v OFS=\| '$3=="RM99999" && $17 == 10 { $17=65 } {print ; } '

어디

  • -F\|awk에게 |를 필드 구분 기호로 사용하도록 지시( \쉘에게 이스케이프 지시 |)
  • -v OFS=\|레코드를 출력할 때 |를 필드 구분자로 사용하도록 awk에 지시합니다.
  • $3=="RM99999" && $17 == 10RM99999는 세 번째 줄, 10은 17번째 줄을 선택하세요.
  • $17 = 6565로 교체
  • { print ; }변경된 패턴과 변경되지 않은 패턴 모두 인쇄

답변2

sed '/^.\{19\}RM99999/s/10/65/' <in >out

문자열의 첫 번째 항목을 대체합니다.10문자열 사용65문자열이 있는 줄에RM9999920번째 문자부터 시작합니다.

일부 사람들은 필드 17을 교체해야 한다고 생각합니다. 질문에서 볼 수 없기 때문에 왜 그런지 잘 모르겠습니다. 그러나 그것이 당신이 원하는 것이라면 ...

sed '/^.\{19\}RM99999/s/[^|]*/65/17' <in >out

... |17번째 구분 필드가 문자열로 대체 됩니다.65문자열이 있는 줄에RM9999920번째 문자부터 시작합니다.

나는 단지 빨대를 쥐고 ​​있는 중이지만 아마도 그것은 단지 10, 필드 17, 그리고 오직RM9999920자로 시작하시겠습니까? 좀 어렵네요...

sed -e'/^.\{19\}RM99999/s/|/|\n/16' \
    -e's/\n\([^|]*\)10/\165/;s/\n//' <in >out

...하지만 이렇게 하면 됩니다. 곰곰히 생각해보면 그럴 것 같다.조금자신의 코드와 더 비슷합니다. 어쩌면 그것이 우리가 결국 원하는 것일 수도 있다.

이게 좀 더 직관적인데...

sed -e'/^.\{19\}RM99999/!b'    \
    -e's/|\([^|]*10\)*/&\n/16' \
    -e's/10\n/65/;s/\n//'

필드 수가 고정되어 있으면 이 단계를 완료할 수 있습니다.

sed -e'/^.\{19\}RM99999/s/10\([^|]*\(|[^|]*\)\{7\}\)$/65\1/'

물론 프런트엔드에서도 같은 작업을 수행할 수 있습니다.

sed -e'/^.\{19\}RM99999/s/^\([^|]*\(|[^|]*\)\{16\}\)10/\165/'

하지만 꼬리에는 필드 수가 절반밖에 없기 때문에 도움이 된다면 이렇게 하지 않는 것이 좋습니다.

확장 정규식 구문을 사용하면 작성하기가 조금 더 쉽습니다.

sed -Ee'/^.{19}RM99999/s/10([^|]*(\|[^|]*){7})$/65\1/'

관련 정보