sed는 패턴 뒤의 줄을 제거하고 이 간격에 새 줄을 추가합니다.

sed는 패턴 뒤의 줄을 제거하고 이 간격에 새 줄을 추가합니다.

일부 파일을 자동으로 업데이트하려고 합니다. 행을 찾아서 해당 행 뒤의 일부 행을 삭제해야 합니다. 또한 삭제된 행을 대체 행으로 바꿔야 합니다.

예를 들어보면 더 명확해질 것입니다.

원래:

line aa/aa/aa/aa
line bb/bb/bb/bb
line cc/cc/cc/cc
line dd/dd/dd/dd
line ee/ee/ee/ee
line ff/ff/ff/ff
line gg/gg/gg/gg
line hh/hh/hh/hh
line ii/ii/ii/ii

그래서 나는 이렇게 생각했다:

  1. 예를 들어 검색 패턴이 bb/bb/bb/bb있으므로 처음 두 행을 유지합니다.

  2. 다음 3~6행을 삭제하고 교체합니다.uu/uu/uu/uu

최종 결과:

line aa/aa/aa/aa
line bb/bb/bb/bb
line cc/cc/cc/cc
line dd/dd/dd/dd
line uu/uu/uu/uu
line ii/ii/ii/ii

다음을 사용하여 다음 줄을 찾아 삭제할 수 있습니다.

sed -e '/pattern/{n;N;N;N;N;d}' file.txt

하지만 동시에 새 행을 추가하는 방법을 모르겠습니다. 나는 또한 일부를 포함하는 데 관심이 있습니다 /.

답변1

~처럼와일드카드힌트, 스크립트 가능한 편집기를 사용하면 이 작업이 더 쉬워집니다. 패턴 뒤의 세 번째부터 여섯 번째 줄을 bb/bb/bb/bb단일 줄로 바꾸려면 line uu/uu/uu/uu다음 ed파이프를 사용할 수 있습니다.

printf '%s\n' '/bb\/bb\/bb\/bb' '+3,+6c' 'line uu/uu/uu/uu' '.' 'wq' | ed -s file.txt > /dev/null

높은 수준에서 우리는 개행으로 구분된 명령을 에 파이프하여 ed이름이 지정된 파일을 자동으로 편집 file.txt하고 모든 "표준 출력"을 bitbucket에 넣도록 지시합니다 /dev/null. 이 플래그는 읽은 바이트 수와 쓴 바이트 수의 일반 출력을 억제합니다 -s. 일치하는 줄도 인쇄되므로(이 시나리오에서는 "bb" 줄) 해당 플래그를 제거하고 stdout 및 stderr을 리디렉션할 수 있습니다.eded> /dev/null-s

명령 ed자체는 다음과 같습니다.

  • /bb\/bb\/bb\/bb/bb/bb/bb/bb- 슬래시를 이스케이프 처리해야 하는 위치가 포함된 줄을 검색합니다 . 그렇지 않으면 슬래시가 구문 문자이기 때문에 일치하는 줄에 이상한 명령을 보내 ed려고 하는 것으로 간주됩니다 .bb/bb/bb/bb/
  • +3,+6c-- 이 줄부터 시작해서 c3~6줄을 뒤에 걸어주세요...
  • line uu/uu/uu/uu-- 이 줄로 이동
  • .-- ed라인 교체가 완료되었음을 알려드립니다.
  • wq-- 그런 다음 w파일을 디스크에 쓰고 q설치합니다 .ed

이는 bb/bb/bb/bb파일에 존재한다고 가정합니다. 그렇지 않으면 ed파일이 끝난 후 3~6행을 편집하려고 하면 오류가 발생하게 됩니다. 패턴이 파일에 존재하는지 확신할 수 없는 경우 이 스크립트 앞에 를 추가하여 grep -q bb/bb/bb/bb file.txt && printf...조건부로 파이프라인을 실행할 수 있습니다.

답변2

그리고암소 비슷한 일종의 영양 sed:

sed -ne '\#bb/bb/bb/bb#{p;n;p;n;p;n;n;n;n;a line uu/uu/uu/uu' -e ';b };p' file.txt 

산출:

line aa/aa/aa/aa
line bb/bb/bb/bb
line cc/cc/cc/cc
line dd/dd/dd/dd
line uu/uu/uu/uu
line ii/ii/ii/ii

출력을 다음에 저장파일.txt로 변경 .-ne-ine


참고: 두 개의 스위치가 있는 코드의 간격 -e은 간격이a미정추가를 중지할 명령입니다.

또 다른 방법은POSIX sed, 그러나 이것은 간단한 문장이 아닙니다.

sed -n '\#bb/bb/bb/bb#{p;n;p;n;p;n;n;n;n;a\
line uu/uu/uu/uu
b };p' file.txt

답변3

POSIX를 사용하면 sed다음을 수행할 수 있습니다.

 $ sed -e '
   \:line bb/bb/bb/bb:!b
    n;n;n
    N;N;N
    s:.*:line uu/uu/uu/uu:
 ' inp

대상 라인과 이어지는 두 라인을 인쇄한 후 패턴 공간에 다음 세 라인을 누적하고 전체 패턴 공간을 예상 라인으로 변경합니다. 패턴 공간을 표준 출력으로 가져올 때 개행 문자는 sed 자체에서 처리됩니다.

실패 하지 않도록 대상 행 뒤에 충분한 행이 있다고 가정합니다 N.

관련 정보