2012-09-19 3 views
4

패턴 ###을 현재 줄 번호로 바꿔야합니다.Sed가 줄 번호로 패턴 바꾸기

AWK와 SED 모두를 사용하여 다음 줄에 인쇄 할 수있었습니다.

sed -n "/###/{p;=;}" filep;없이 다음 줄로 인쇄하고 전체 줄을 바꿉니다.

sed -e "s/###/{=;}/g" file=;가 일치하는 패턴의 행 번호를 반환하기 때문에, 내 머리에서 이해하는 데 사용하지만 텍스트 {=;}

내가 무엇을 놓치고 나에게 돌아갑니다? 나는 이것이 바보 같은 질문이라는 것을 알고있다. 나는 sed 매뉴얼에서이 질문에 대한 답을 찾을 수 없었다. 그것은 분명하지 않다.

가능하면 무엇을 놓치고 무엇을 작동하게하는지 알려주십시오. 고마워요

+0

['표준 출력에 "="명령 만 인쇄하기 때문에, 당신은 pattern.' 같은 줄에 줄 번호를 인쇄 할 수 없습니다] HTTP (: //www.grymoire.com/Unix/Sed.html#uh-48) –

+0

Awk에서 가능합니까? – ghaschel

+0

'perl -pe 's /###/$./ g'' –

답변

5

간단한 awk oneliner 생산할 것이다 경우 : 레프 Levitsky 의해 바와 같이

awk '{gsub("###",NR,$0);print}' 
+0

@Thor 아마 다른 가정을하고 있습니다 - 줄 번호를 줄의 맨 앞에 두지 않습니까? 나는 OP에서 "###"이 줄의 어느 곳이라도 읽을 수 있다는 것을 읽었고, 그러므로'gsub()'를 의미한다. 2 단 독서에서 줄의 시작 부분에있는 숫자가 염두에 두는 것 같습니다. – twalberg

1

이게 맞나요?

kent$ echo "a 
b 
c 
d 
e"|awk '/d/{$0=$0" "NR}1' 
a 
b 
c 
d 4 
e 

일치 패턴이 "d"인 경우 줄 끝 부분에 줄 번호를 추가하십시오.

편집

오, 당신은 새로운 cmd를 봐 가지고 ... 패턴이 줄 번호를 추가하지 교체하려면 :

kent$ echo "a 
b 
c 
d 
e"|awk '/d/{gsub(/d/,NR)}1' 
a 
b 
c 
4 
e 

과 라인으로 다음과 같이 작성할 수를 잘 : awk '1+gsub(/d/,NR)' file

+0

OP가 패턴을 회선 번호로 대체해야합니다. 정확히 답이 아닙니다. –

+0

@LevLevitsky thx가 지적했습니다. 업데이트되었습니다. – Kent

4

주어진 the limitations of the = command, 나는 2 개의 (실제로, 3 개의) 부품으로 작업을 나누는 것이 더 쉽다고 생각한다. GNU sed하면 수행 할 수 있습니다

$ sed -n '/###/=' test > lineno 

하고 뭔가

$ sed -e '/###/R lineno' test | sed '/###/{:r;N;s/###\([^\n]*\n\)\([^\n]*\)/\2\1/;tr;:c;s/\n\n/\n/;tc}' 

처럼 내가 sed와 간단한 방법은 없습니다 두려워하기 때문에,뿐만 아니라 = 명령의 r 및 GNU 확장 R 명령은 패턴 공간으로 파일을 읽지 않고 출력에 직접 행을 추가하므로 파일의 내용을 어떤 방식 으로든 수정할 수 없습니다. 따라서 다른 sed 명령으로 파이핑합니다.

test의 내용

fooo 
bar ### aa 
test 
zz ### bar 

fooo 
bar 2 aa 
test 
zz 4 bar 
2

이 아니다 가능하다 줄 번호가 표준 출력으로 직접 보내지기 때문에 sed를 한 번 호출합니다.

당신은 당신을 위해 나오지도 스크립트를 작성하고,이 개 패스 교체를 할 나오지 수도

:

sed -n '/###/=' infile 
: 패턴을 포함하는 라인을 찾기

a 
b 
c 
d 
e 
### 
### 
### 
a 
b 
### 
c 
d 
e 
### 

INFILE

출력 :

6 
7 
8 
11 
15 

파이프가 새 나오지 스크립트 쓰기 나오지도 스크립트로 :

sed 's:.*:&s/###/&/:' 

출력 :

6s/###/6/ 
7s/###/7/ 
8s/###/8/ 
11s/###/11/ 
15s/###/15/ 

실행 :

sed -n '/###/=' infile | sed 's:.*:&s/^/& \&/:' | sed -f - infile 

출력 :

a 
b 
c 
d 
e 
6 
7 
8 
a 
b 
11 
c 
d 
e 
15 
2

이 (GNU가 나오지도) 당신을 위해 일 수 있습니다

sed = file | sed 'N;:a;s/\(\(.*\)\n.*\)###/\1\2/;ta;s/.*\n//'