sed를 사용하여 여러 줄 문자열을 바꾸는 방법은 무엇입니까? [폐쇄]

sed를 사용하여 여러 줄 문자열을 바꾸는 방법은 무엇입니까? [폐쇄]

나는 다음 명령을 시도했습니다 :-

[root@10 bin]# cat temp
asdjahskjdhajksdhjkashjahfksjdhfkjsddhflkdsjhfklsdajhfklajshdkjalsdlkjasdhkljas
hskdajkdhkjas
 cast $recv $UE_CAPABILITY_ENQUIRY
                set trans_id [ string range $recv 42 43 ]

[root@10 bin]# sed -ir '/^cast \$recv \$UE_CAPABILITY_ENQUIRY$/{$!{N;s/^cast \$recv \$UE_CAPABILITY_ENQUIRY\nset trans_id \[ string range \$recv 42 43 \]$/cast \$recv \$UE_CAPABILITY_ENQUIRY \nset trans_id 1/;ty;P;D;:y}}' temp

나는 바꾸고 싶다

 cast $recv $UE_CAPABILITY_ENQUIRY
                set trans_id [ string range $recv 42 43 ]

그리고

cast $recv $UE_CAPABILITY_ENQUIRY
                set trans_id 1

그러나 위의 명령은 작동하지 않습니다. 누군가 내 실수를 지적할 수 있나요?

답변1

실제로 "캐스트" 줄을 변경하지 않기 때문에:

sed '/cast \$recv \$UE_CAPABILITY_ENQUIRY/{a\
                set trans_id 1
n;d}' file

Kusalananda가 언급했듯이 이 명령은 다음과 같습니다.

  • 원하는 "캐스트" 라인 중 하나가 발견되면:
    • a새 줄 추가
    • n파일에서 추가 줄 제거(원치 않는 "설정" 줄)
    • 그리고 d삭제해

돌이켜 보면 삭제된 행이 삭제하려는 행인지 확인되지는 않습니다. 나는 그것을 다음과 같이 바꿀 것입니다 :

sed '
    /cast \$recv \$UE_CAPABILITY_ENQUIRY/ {
        n
        /set trans_id \[ string range \$recv 42 43 \]/ {
            i\
                set trans_id 1
            d
        }
    }
' file

파일 재귀의 경우:

find . type f | xargs sed -i '' -e '...'

GNU 도구를 사용하여 더욱 안전하게

find . type f -print0 | xargs -0 sed -i '' -e '...'

관련 정보