나는 다음 명령을 시도했습니다 :-
[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 '...'