sed -n
명령 처리 후의 결과만 표시됨을 의미하므로 결과를 표시하려면 'p'를 추가해야 합니다.- 그렇지 않으면
sed -n
결과가 표시되지 않습니다
이게 옳은 거니?
sed [root@ljl ~]# cat a.txt
1111simon111
simon2222222
333simon3333
444444444444
5555555simon
simon6666666
7777777simon
888888888888
[root@ljl ~]# sed -n 's/simon/lili/gp' a.txt
1111lili111
lili2222222
333lili3333
5555555lili
lili6666666
7777777lili
[root@ljl ~]# sed -n 's/simon/lili/g' a.txt
[root@ljl ~]#
답변1
각 "루프"의 끝에서 편집 스크립트의 최종 명령 실행을 마치면 패턴 공간의 현재 내용을 인쇄하고 이를 현재 입력 파일의 다음 줄로 바꾸는 sed
암시적 명령이 있습니다 . n
그래서 스크립트는주기맨 위로 돌아갑니다.
해당 옵션으로 시작하면 이 명령(및 스크립트의 다른 명령 n
)의 출력이 표시되지 않습니다.n
sed
-n
사용은 -n
의미하지 않습니다모두출력이 sed
억제됩니다. 예를 들어, r
파일에서 텍스트를 읽고 이를 표준 출력으로 보내는 명령은 =
현재 행 번호를 인쇄하는 명령과 마찬가지로 여전히 표준 출력에 출력을 생성합니다. 마찬가지로 텍스트를 추가, 삽입 및 변경하기 위한 명령 , 및 와 다양한 특정 방식으로 텍스트를 출력하기 위한 명령 , 및 는 a
관계없이 출력을 생성합니다(이러한 명령의 특정 기능에 대해서는 설명서를 참조하세요). 오류 등은 자연스럽게 표준 오류에도 없는 것처럼 출력됩니다.i
c
l
P
-n
sed
-n
또한 이 명령은 질문에서 언급한 플래그 ( )와 함께 사용된 명령 p
과 마찬가지로 여전히 출력을 생성합니다.s///
p
s///p
명령이 패턴 공간을 버리고 즉시 다음 루프를 시작하면 d
덜 일반적으로 사용되는 명령과 마찬가지로 항상 스크립트 끝의 암시적 항목을 건너뜁니다.n
D
-n
sed
이 옵션은 스크립트 시작 부분에 사용 하여 #n
스크립트 내에서 호출 할 수 있습니다.
예: 명령줄에서 사용되는지 여부에 관계 없이 sed
하위 문자열이 포함된 행만 인쇄하는 스크립트 .HELLO
-n
#n
/HELLO/p
첫 번째 줄에 있어야 합니다. 이 스크립트에서는 #n
스크립트의 명시적 명령에 의해 인쇄되는 내용을 제외한 모든 줄의 인쇄가 억제됩니다.p
답변2
p
예, 을 사용하는 경우 일치/수정된 라인을 인쇄하려면 을 사용해야 합니다 -n
.
man sed
(GNU 버전) 에서 :
-n, --조용함, --무음
패턴 공간의 자동 인쇄 억제
답변3
sed -n
"명령 처리 결과만 표시한다"는 의미는 아닙니다. 이는 "명시적으로 요청한 경우에만 인쇄", 즉 "자동으로 인쇄하지 않음"을 의미합니다.
p
일반적으로 명시적이고 무조건적으로 인쇄하려면 명령을 사용합니다 . 귀하의 경우에는 다음과 같습니다:
sed -n 's/simon/lili/g;p' a.txt
위의 구문은 사용한 구문이 아닙니다. 이것이 당신이 사용하는 것입니다:
sed -n 's/simon/lili/gp' a.txt
이것은 p
( g
수식어와 같은) 수식어 인데 s
, 이는 "교체하면그런 다음 새 패턴 공간을 인쇄합니다." 해당 p
명령과 마찬가지로 명시적인 인쇄 요청(그래서 유용함 -n
)이지만 조건부입니다.