![sed를 사용하여 여러 줄 문자열을 바꾸는 방법은 무엇입니까? [폐쇄]](https://linux55.com/image/9178/sed%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%97%AC%EB%9F%AC%20%EC%A4%84%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%EB%B0%94%EA%BE%B8%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F%20%5B%ED%8F%90%EC%87%84%5D.png)
나는 다음 명령을 시도했습니다 :-
[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 '...'