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 == 10
RM99999는 세 번째 줄, 10은 17번째 줄을 선택하세요.$17 = 65
65로 교체{ 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/'