Sed - 특정 줄과 특정 문자 뒤에 문자열을 삽입하는 방법은 무엇입니까?

Sed - 특정 줄과 특정 문자 뒤에 문자열을 삽입하는 방법은 무엇입니까?

파일에 몇 줄의 코드를 삽입해야 합니다. 문제는 특정 함수 호출 뒤와 그 뒤의 세미콜론 뒤에 삽입하고 싶다는 것입니다.

를 통해 이를 달성하고 싶지만 sed이유를 모르겠습니다.


예:

소스 코드 조각:

10 printf("asdf");
11
12 myFunc()
13
14 ;

여기서는 호출 후에 코드 조각을 삽입하고 싶지만 myFunc()13행이 아닌 15행에 직접 삽입하고 싶습니다.

삽입 후 필요한 코드:

10 printf("asdf");
11
12 myFunc()
13
14 ;
15 SNIPPET

내 최선의 시도는 다음과 같습니다.

sed -e '13 i\SNIPPET'

이것은 분명히 세미콜론을 "기다리지" 않습니다.

그렇다면 이러한 조건을 결합하여 줄 번호 *** 뒤의 첫 번째 세미콜론 뒤에 코드 조각을 삽입할 수 있는 방법이 있습니까?

답변1

어때요?

sed '
  /myFunc()/!b
  :1 
  s/;/; SNIPPET/;t
  n;b1'

또는 13행의 경우:

sed '
  13!b
  :1 
  s/;/; SNIPPET/;t
  n;b1'

답변2

나는 사용하지 않을 것입니다 sed. 본질적으로 행 지향적 특성으로 인해 이 목적에 좋은 도구라고 생각하지 않습니다.

나는 다음을 추천한다:

#!/usr/bin/env perl
use strict;
use warnings;

while (<>) {
    #print current line (because we insert _after) 
    print;
    #extract the number. If you need to work on _actual_ line number, you need $.
    my ($num) = m/^(\d+)/;
    if ( $num > 13 and m/;/ ) {
        #print snippet, bail out
        print ++$num, " SNIPPET\n";    
        last;
    }
}
#print rest of file
print <>;

참고 - 이는 귀하의 예를 기반으로 콘텐츠에서 숫자를 추출합니다. 실제 줄 번호를 원하는지 확실하지 않습니다. 물론 sed -e '13 ..'그럴 것이라는 암시가 있기는 하지만요.

이 경우:

if ( $. > 13 and m/;/ ) {
    print "SNIPPET\n"; 
    last;
}

관련 정보