우리는 다음과 같은 파일을 가지고 있습니다:
more /tmp/file
Allow,Deny
Allow,Deny
두 번째로 일치하는 단어만 변경하려고 합니다(Allow,Deny를 Deny,Allow로 교체).
그래서 우리는 그랬어
sed 's/Allow,Deny/Deny,Allow/1' /tmp/file
Deny,Allow
Deny,Allow
하지만 그것은 그들을 대체합니다
그리고 예상되는 결과는 다음과 같습니다.
Allow,Deny
Deny,Allow
두 번째로 일치하는 단어만 바꾸는 방법
답변1
또 다른 sed 솔루션.
sed '0,/Allow/!{0,/Allow/s/Allow/Deny/}' /tmp/file
여기서는 첫 번째 항목을 일치시킨 Allow
다음 첫 번째 항목의 대체 항목을 무시하고 Allow
다음 줄을 바꿉니다.
아이디어를 제공하기 위해 다음은 우리가 사용한 이후 두 번째와 네 번째를 대체합니다.N;
sed '0,/Allow/!{N;/Allow/s/Allow/Deny/}'
또는 다음을 사용하십시오 awk
.
awk '/Allow/{c++; if (c==2) { sub("Allow","Deny")}}1'
일치시킨 Allow
다음 카운터를 유지합니다 c
. 이것이 2
두 번째 발생과 일치하면 이를 대체합니다.
답변2
두 번째로 일치하는 단어만 변경합니다(Allow,Deny를 Deny,Allow로 교체).
sed해결책:
샘플 tmp_file
:
Allow,Deny
Allow,Deny
Allow,Deny
Allow,Deny
sed ':a;N;$!ba; s/Allow,Deny/Deny,Allow/2' tmp_file
산출:
Allow,Deny
Deny,Allow
Allow,Deny
Allow,Deny