다음 텍스트가 있습니다.
A
Hello
world
B
Hello
world
C
Hello
world
Hello
다음을 사용하여 Hi
대체 할 수 있다는 것을 알고 있습니다 sed
.
sed 's/Hello/Hi/g' -i test
그러나 이것은 각각을 Hello
다음으로 대체합니다 Hi
.
A
Hi
world
B
Hi
world
C
Hi
world
Hello
내가 정말로 원하는 것은 뒤에 오는 것만 바꾸는 것입니다 B
.
A
Hello
world
B
Hi
world
C
Hello
world
그래서 나는 이것을 시도했습니다 :
sed 's/"B\nHello"/"B\nHi"/g' -i test
그런데 아무 일도 일어나지 않는데 어떻게 해야 하나요?
참고: 파일의 각 줄 시작 부분에는 공백이 있습니다.
답변1
그것은 다음과 같습니다:
sed '/^[[:blank:]]*B$/{n;s/Hello/Hi/g;}'
연속된 s가 없다고 가정합니다 B
(한 B
줄 뒤에 다른 줄이 옴 B
).
그렇지 않으면 다음과 같이 할 수 있습니다.
awk 'last ~ /^[[:blank:]]*B$/ {gsub("Hello", "Hi")}; {print; last=$0}'
이에 상응하는 sed
것은 다음과 같습니다.
sed 'x;/^[[:blank:]]*B$/{
g;s/Hello/Hi/;b
}
g'
B
뒤의 두 번째 단어를 바꾸 거나 위의 두 줄에 다음이 포함된 경우에만 world
:universe
B
awk 'l2 ~ /B/ {gsub("world","universe")}; {print; l2=l1; l1=$0}'
위의 줄로 요약하면 다음과 같습니다 n
.
awk -v n=12 'l[NR%n] ~ /B/ {gsub("foo", "bar")}; {print; l[NR%n]=$0}'
답변2
B 전후에 흰색을 찾는 명령을 추가할 수 있습니다.
u1이 다음과 같다고 가정하자
A
Hello
world
B
Hello
world
C
Hello
world
B (<-tailing whites)
Hello
world
명령 사용
sed '/^[ ]*B[ ]*$/{n;s/Hello/Hi/;}' u1
A
Hello
world
B
Hi
world
C
Hello
world
B
Hi
world
답변3
이는 두 가지 연속 상황이 있을 때 sed
상황을 처리합니다 B
.
$ sed ':a
/B$/{$!N;/\n[[:blank:]]*Hello$/!ba;s/Hello/Hi/}
' file