기본적으로 입력 컴퓨터, 사용자 등에 대한 항목을 추가 .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
이를 처리하고 검사할 수 있으며 그런 다음 나중에 파일에서 원하는 내용, 방법 또는 끝 부분을 출력(또는 출력하지 않음)할 수 있습니다. 파일의 ( awk
END 주소 지정자 사용)
업데이트: awk
문서에 따르면 이 답변이 작동하려면 주석 기호가 파일의 다른 곳에 존재하지 않도록 요구할 이유가 없습니다. 값이 RS
정규 표현식일 수 있기 때문입니다!