sed 또는 awk를 사용한 여러 줄 문자열 패턴 일치, 삽입 및 삭제

sed 또는 awk를 사용한 여러 줄 문자열 패턴 일치, 삽입 및 삭제

기본적으로 입력 컴퓨터, 사용자 등에 대한 항목을 추가 .ssh/config하는 SSH 관리 도구입니다 ..ssh/config

질문:

의 모든 인스턴스를 자동으로 삽입하거나 삭제하는 데 사용할 수 있는 도구(예 sed: 또는 )가 있습니까?awk여러 줄끈?

예를 들어 sed다음 명령을 사용합니다.

# inserts "stuff" in the line above "single-line-pattern" in file
sed -i.bkp "/single-line-pattern/i stuff" file

# inserts "stuff" in the line below "single-line-pattern" in file
sed -i.bkp "/single-line-pattern/a stuff" file

# removes all instances of "single-line-pattern" from file
sed -i.bkp "/single-line-pattern/d" file

가능한 해결책

패턴의 모든 인스턴스를 제거하는 깔끔한 해결 방법은 문제를 되돌리고 인스턴스가 아닌 모든 항목을 찾아서 새 파일로 인쇄한 다음 이전 파일을 삭제하는 것입니다. 항목 위에 추가하는 것을 무시하고(모두 제거했기 때문에) 고정된 순서로 파일 끝에 추가했습니다.

그러나 이것은 위의 질문에 대한 답변이 아니며 그러한 도구 또는 기능의 예를 제공하지도 sed않습니다 awk.여러 줄끈.

내 솔루션

아래에는 나에게 맞는 해키 스크립트가 나와 있습니다. 내가 이것을 사용 awk하고 여러 줄 문제를 매우 잘 처리한다는 것을 알 수 있습니다 . 다만 제가 아는 한 위에 제시된 예 awk처럼 이 문구를 조작하거나 해결하기 위해 제공되는 도구가 많지 않을 뿐입니다 .sed

# create backup of file
cp $FILE $FILE.bak

# delete previous .tmp file
if [ -f $FILE.tmp ]; then
    rm $FILE.tmp
fi

# if the expression is not in the paragraph, append it to $FILE.tmp
awk -v RS="" -v expr1="Host $COMPUTER" -v expr2="Match originalhost \
$COMPUTER" -v user="User $USER" \
'{ if (! (($0 ~ expr1 || $0 ~ expr2) && $0 ~ user)) print$0 "\n"}' \
$FILE >> $FILE.tmp

mv $FILE.tmp $FILE

나의 문제 공간

$FILE아래에는 and 에 대한 $COMPUTER="compy"일치하는 단락 세트가 나와 있습니다 . $USER="harpo"다른 컴퓨터의 항목이나 동일한 컴퓨터의 다른 사용자의 항목을 상상할 수 있습니다(따라서 컴퓨터와 사용자가 일치하는지 확인).

Match originalhost compy exec /usr/local/bin/superscript.sh
   HostName 192.168.0.101
   User harpo
   Port 22
   IdentityFile /home/harpo/.ssh/id_rsa

Host compy
   HostName 123.123.123.123
   User harpo
   Port 33
   IdentityFile /home/harpo/.ssh/id_rsa

답변1

각 단락 사이에 주석 기호를 넣고 파일에 다른 주석 기호가 없는지 확인하는 방법. 그런 다음 awk전체 단락을 단일 레코드로 RS="#"읽 도록 사용하고 설정할 수 있습니다. awk이를 처리하고 검사할 수 있으며 그런 다음 나중에 파일에서 원하는 내용, 방법 또는 끝 부분을 출력(또는 출력하지 않음)할 수 있습니다. 파일의 ( awkEND 주소 지정자 사용)

업데이트: awk문서에 따르면 이 답변이 작동하려면 주석 기호가 파일의 다른 곳에 존재하지 않도록 요구할 이유가 없습니다. 값이 RS정규 표현식일 수 있기 때문입니다!

관련 정보