sed를 사용하여 첫 번째 일치 후 줄 삽입

어떤 이유로 이것에 대한 간단한 답을 찾을 수없는 것 같고 현재 약간의 시간이 촉박합니다. sed` 명령을 사용하여 특정 문자열과 일치하는 첫 번째 줄 뒤에 선택 텍스트 줄을 삽입하려면 어떻게해야합니까? 나는 ...

CLIENTSCRIPT="foo"
CLIENTFILE="bar"

그리고 CLIENTSCRIPT= 줄 뒤에 한 줄을 삽입하여 ...

CLIENTSCRIPT="foo"
CLIENTSCRIPT2="hello"
CLIENTFILE="bar"
해결책

GNU sed를 사용하여 이 작업을 수행해 보세요:

sed '/CLIENTSCRIPT="foo"/a CLIENTSCRIPT2="hello"' file

제자리_로 대체하려면 다음을 사용하십시오.

sed -i '/CLIENTSCRIPT="foo"/a CLIENTSCRIPT2="hello"' file

Output

CLIENTSCRIPT="foo"
CLIENTSCRIPT2="hello"
CLIENTFILE="bar"

Doc

  • sed doc]1을 참조하고 \a를 검색합니다(추가).
해설 (14)

표준 sed 구문에 유의하세요(POSIX에서와 같이 모든 호환되는 sed 구현(GNU, OS/X, BSD, Solaris...)에서 지원됨):

sed '/CLIENTSCRIPT=/a\
CLIENTSCRIPT2="hello"' file

또는 한 줄에:

sed -e '/CLIENTSCRIPT=/a\' -e 'CLIENTSCRIPT2="hello"' file

(-e 표현식(및 -f 파일의 내용)은 개행으로 결합되어 sed 스크립트 sed가 해석합니다).

제자리 편집을 위한 -i 옵션도 GNU 확장이며, 일부 다른 구현(예: FreeBSD)은 이를 위해 -i '&#39를 지원합니다.

또는 이식성을 위해 perl을 대신 사용할 수 있습니다:

perl -pi -e '$_ .= qq(CLIENTSCRIPT2="hello"\n) if /CLIENTSCRIPT=/' file

또는 ed 또는 ex를 사용할 수 있습니다:

printf '%s\n' /CLIENTSCRIPT=/a 'CLIENTSCRIPT2="hello"' . w q | ex -s file
해설 (4)

Posix 호환 one 's' 를 사용하여 명령:

sed '/CLIENTSCRIPT="foo"/s/.*/&\
CLIENTSCRIPT2="hello"/' file
해설 (2)

Sed (최소한, OS 10 명) 와 MacOS 에서 작동하는 유닉스 명령 것 (예: # 39, sed, gnu Gilles& # 39 와 같은 doesn& 필요 없다. (현재 수락됨) 한 높여줍니까):

sed -e '/CLIENTSCRIPT="foo"/a\'$'\n''CLIENTSCRIPT2="hello"' file

이 옵션은 $ & # 39, bash, 어쩌면 다른 발이 너무 알고 있는 \n& # 39. 평가 쿼트에 스타일. 다, 한 행에 작업하십시오 수 있습니다. sed 명령의세 older/posix. 여러 줄 수 있다면 해당 클라이랑스크리프트 = &quot foo"; (또는 dell. avamer) 와 프로파일링하려는 만 추가할 수 있습니다 추가 선 처음 재작업 it 다음과 같습니다.

sed -e '/^ *CLIENTSCRIPT="foo"/b ins' -e b -e ':ins' -e 'a\'$'\n''CLIENTSCRIPT2="hello"' -e ': done' -e 'n;b done' file

(이렇게 하면 루프를 이후 선 삽입에서 코드 그건 순환합니다 미삭 파일의 첫 번째 sed 명령을 다시 뒤로를 가져오는 않았다).

내가 ^ *& # 39, & # 39 를 추가로 확인할 수 있습니다. 보여 줄 수 있는 패턴과 일치하는 경우, 말, 또는 들여쓰기된 셀명 까지 있다. 그러나 일부 다른 가능성이 없는 완벽한 상황을 닫히지만 100% 는 흔하다. 필요에 따라 조정하십시오.

이 두 가지 솔루션을 문제를 라운드하지 얻을 수 있다 (원본에 대한 해결책을 추가에는 선) 을 받을 수 있는 새로운 삽입됨 줄에는 백 슬래시 이스케이프 필드앰퍼샌드 해석할 경우 또는 sed 와 마찬가지로 '\n' 가 나오지 않은 것 같은 - 예. '\0' 약간만이라도 첫 번째 줄은 일치시킵니다. 특히 되어 있는 경우, re 추가에는 you& # 39 에서 줄이 그때그들은 가변적입니다 you& # 39$ {} var / / 전에 먼저 사용하여 모든 이스케이프입니다 할 경우, d, 또는 다른 sed 기술서임을 상술합니다.

이 솔루션은 과도한 조금 덜 스크립트 (견적 및 \n 읽을 수 있는 것은 쉽지 않다), t want to put don& 때 # 39 의 대체 텍스트를 명령 줄 수 있는 기능이 있으면 말하도다 들여쓰기된 시작할 때 발생한다. # 39, & # 39$ # 39, ve 수행됨을 \n& i& 있다는 장점이 있습니다. 줄 바꿈 없는 일반 & # 39 에 의해 해당 쉘로 검사됩니다 \n& # 39;; 단일 인용 값.

Awk 는 충분히 이길 수 있다고 생각한다 해도 이를 펄 / 인해 보다 쉽게 읽을 수 있다.

해설 (2)

비슷한 작업을 수행했는데 위의 펄 솔루션이 작동하지 않았습니다.

제 해결책은 다음과 같습니다:

perl -i -pe "BEGIN{undef $/;} s/^\[mysqld\]$/[mysqld]\n\ncollation-server = utf8_unicode_ci\n/sgm" /etc/mysql/my.cnf

설명:

정규식을 사용하여 내 /etc/mysql/my.cnf 파일에서 [mysqld]만 포함된 줄을 검색하여 다음과 같이 바꿉니다.

[mysqld] collation-server = utf8_unicode_ci

'[mysqld]가 포함된 줄 뒤에collation-server = utf8_unicode_ci` 줄을 효과적으로 추가했습니다.

해설 (0)

Awk 는 변형.

awk '1;/CLIENTSCRIPT=/{print "CLIENTSCRIPT2=\"hello\""}' file
해설 (1)

아마 조금 늦은 게시물로의 그에 대한 답을 찾을 수 있지만, 내가 이 중 일부는 위의 솔루션뀉뀉뀉뀉 다소 번거로운.

Sed 에 전화했는데 간단한 문자열 대체 및 통했다.

sed 's/CLIENTSCRIPT="foo"/&\nCLIENTSCRIPT2="hello"/' file

&amp 반영하고, 예중이 정합된 구체화하십시오 후 추가했는지 \n 및 새로운 할말이다

이를 언급한 바와 같이, 스케쳐내 현재 위치:

sed -i 's/CLIENTSCRIPT="foo"/&\nCLIENTSCRIPT2="hello"/' file

또 다른거. 일치시킵니다 표현식에서는 사용할 수 있습니다.

sed -i 's/CLIENTSCRIPT=.*/&\nCLIENTSCRIPT2="hello"/' file

누군가 이렇게 하면 된다.

해설 (0)