sed를 사용하여 중요한 줄과 공백 뒤의 단어를 바꾸시겠습니까(인라인)?

sed를 사용하여 중요한 줄과 공백 뒤의 단어를 바꾸시겠습니까(인라인)?

다음 텍스트가 있습니다.

  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:universeB

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

관련 정보