패턴을 포함하는 줄 앞에 새 줄을 추가해야 합니다. 패턴은 항상 현재 줄의 첫 번째 문자열이라고 가정할 수 있습니다. 예를 들어
This is a
pattern
This is a
pattern
sed
다음 명령을 사용하여 새 줄을 추가할 수 있습니다.
sed -i 's/pattern\+/\n&/g' file
출력을 얻다
This is a
pattern
This is a
pattern
여러 개의 새 행이 추가되는 것을 방지하기 위해(여러 번 실행하는 경우) 패턴 앞의 행이 비어 있는지 확인하고 싶습니다. 난 내가 이걸 할 수 있다는 걸 알아
if [ "$line" == "" ]; then
하지만 처음에 패턴과 일치하는 이전 줄을 어떻게 결정합니까?
편집: 패턴이 여러 번 나타날 수 있습니다.
답변1
이전 행을 예약된 공간에 저장할 수 있습니다.
sed '
/^pattern/{
x
/./ {
x
s/^/\
/
x
}
x
}
h'
그러나 더 명확할 것입니다 awk
.
awk '!previous_empty && /pattern/ {print ""}
{previous_empty = $0 == ""; print}'
GNU 구현에 내부 편집 옵션이 sed
있는 것처럼 GNU 구현에도 1개의 기능이 있습니다 .-i
awk
-i /usr/share/awk/inplace.awk
^사용하지 마세요-i inplace
현재 작업 디렉터리(as or)에서 확장 기능을 먼저 gawk
로드 하려고 하면 누군가가 해당 디렉터리에 악성 코드를 심었을 수 있습니다. 시스템과 함께 제공되는 확장 프로그램 의 경로 는 다를 수 있습니다. 출력을 참조하세요.inplace
inplace
inplace.awk
inplace
gawk
gawk 'BEGIN{print ENVIRON["AWKPATH"]}'
답변2
귀하의 질문이 원래 sed에 관한 것이라는 것을 알고 있지만 vim에는 매우 간단한 답변이 있습니다.
:g/.\npattern/norm o
또는 명령줄에서 완전히 실행하려는 경우:
vim file -c "g/.\npattern/norm o" -c "wq"
작동 방식은 다음 정규식과 일치하는 줄을 찾는 것입니다.
.\npattern
이는 패턴을 따르는 공백이 아닌 줄입니다. 그런 다음 각 일치 항목에 대해 norm o
현재 커서 위치 아래에 개행 문자를 여는 다음 명령을 적용합니다 .
답변3
하지만 처음에 패턴과 일치하는 이전 줄을 어떻게 결정합니까?
흠... 아마 이게 먹힐 것 같아요.
사용 grep
및 -B
전환:
-B num, --before-context=num
Print num lines of leading context before each match. See
also the -A and -C options.
다음 파일을 고려해보세요.
cat infile
foo
bar
baz
이제 grep
for를 수행 하면 bar
이전 행은 비어 있어야 합니다.
if [[ $(grep -B 1 'bar' infile | head -1) == "" ]]; then echo "line is empty"; fi
line is empty
grep
on 을 사용하는 것과 반대로 baz
이전 줄은 다음과 같습니다.아니요비어 있는:
if [[ $(grep -B 1 'baz' infile | head -1) == "" ]]; then echo "line is empty"; fi
<no output>
답변4
gnus를 사용한 경우(Linux 및 기타 여러 시스템에서는 기본값이며 모든 사람이 사용할 수 있음)
sed -zri 's/([^\n]\n)(pattern)/\1\n\2/g' file
어디
([^\n]\n)(pattern)
비어 있지 않은 줄 이후의 패턴-z
널 문자로 "줄"을 구분합니다(슬러프 파일).-r
확장자가 포함된 정규 표현식