일부 파일을 자동으로 업데이트하려고 합니다. 행을 찾아서 해당 행 뒤의 일부 행을 삭제해야 합니다. 또한 삭제된 행을 대체 행으로 바꿔야 합니다.
예를 들어보면 더 명확해질 것입니다.
원래:
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
그래서 나는 이렇게 생각했다:
예를 들어 검색 패턴이
bb/bb/bb/bb
있으므로 처음 두 행을 유지합니다.다음 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을 리디렉션할 수 있습니다.ed
ed
> /dev/null
-s
명령 ed
자체는 다음과 같습니다.
/bb\/bb\/bb\/bb
/bb/bb/bb/bb
- 슬래시를 이스케이프 처리해야 하는 위치가 포함된 줄을 검색합니다 . 그렇지 않으면 슬래시가 구문 문자이기 때문에 일치하는 줄에 이상한 명령을 보내ed
려고 하는 것으로 간주됩니다 .bb/bb/bb
/bb/
+3,+6c
-- 이 줄부터 시작해서c
3~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
.