다음과 같은 텍스트 줄을 만들었습니다.
INSERT INTO radcheck(id, username, attribute, op, value) VALUES (,,00:23:32:c2:a9:e8,Auth-Type,:=,Accept);
sed를 사용하여 다음과 같이 만들고 싶습니다.
INSERT INTO radcheck(id, username, attribute, op, value) VALUES (,'','00:23:32:c2:a9:e8','Auth-Type',':=','Accept');
이것은 맥락에서 더 의미가 있으며 지난 (분명히) 17 시간 동안 조금 더 나아졌습니다.
#!/bin/bash
ssh [email protected] brmacs >>MACS.txt mv MACS.txt /etc/persistent scp [email protected]:/etc/persistent/MACS.txt MACS.txt
sed -i "1d" MACS.txt
head -c 58 MACS.txt >>shortmacs.txt
tail -c 18 shortmacs.txt >>usermac.txt
sed 's/"//g' usermac.txt >>usermacrdy.txt
sed -i 's/^/INSERT INTO `radcheck`(`id`, `username`, `attribute`, `op`, `value`) VALUES (,'',/' usermacrdy.txt
sed "s/$/','Auth-Type',':=','Accept');/" usermacrdy.txt > sqlquery.txt
sed -i "s/,,/\,\'\',\'/" sqlquery.txt
rm -f MACS.txt
rm -f shortmacs.txt
rm -f usermac.txt
rm -f usermacrdy.txt
공장!!!
머리와 꼬리는 UBNT CPE 장치에서 xfer'd 원본 텍스트 파일에서 MAC 주소를 잘라낸 다음 sed를 통해 전달하여 MAC 주소 주위에 SQL 구문을 작성합니다.
결국 id
쿼리 의 일부가 성공에 필요하지 않다는 것을 알았으므로 이제는 다음과 같이 약간 동일한 보트에 있습니다.
sed -i 's/^/INSERT INTO `radcheck`(`username`, `attribute`, `op`, `value`) VALUES (/' usermacrdy.txt
sed "s/$/','Auth-Type',':=','Accept');/" usermacrdy.txt > sqlquery.txt
sed -i "s/\,\'\',\'//" sqlquery.txt
필요한 작은 따옴표를 포함하는 네 가지 방법이 있습니다.
작은 따옴표 문자열 내에서 작은 따옴표 문자열을 이스케이프 할 수 없습니다. 그러나 인용 된 문자열을 끝내고 이스케이프 된 작은 따옴표를 삽입 한 다음 새 작은 따옴표로 된 문자열을 시작할 수 있습니다. 따라서 중간에 작은 따옴표를 넣으 'ab'
려면 다음을 사용하십시오 'a'\''b'
. 또는 필요한 sed 명령을 사용합니다.
$ sed -r 's/,([^ ),]+)/,'\''\1'\''/g; s/,,/,'\'\'',/g' file
INSERT INTO radcheck(id, username, attribute, op, value) VALUES (,'','00:23:32:c2:a9:e8','Auth-Type',':=','Accept');
두 번째 방법은 큰 따옴표로 묶인 문자열을 사용하는 것입니다.이 경우 작은 따옴표를 쉽게 삽입 할 수 있습니다.
$ sed -r "s/,([^ ),]+)/,'\1'/g; s/,,/,'',/g" file
INSERT INTO radcheck(id, username, attribute, op, value) VALUES (,'','00:23:32:c2:a9:e8','Auth-Type',':=','Accept');
큰 따옴표로 묶인 문자열의이 문제는 쉘이 문자열을 처리한다는 것입니다. 그러나 여기에는 쉘 활성 문자가 없으므로 쉽습니다.
세 번째 방법은 PM2Ring이 보여주는 것처럼 16 진수 이스케이프를 사용하는 것입니다.
Jonathan Leffler의 의견에서 제안한 네 번째 방법은 sed
명령을 별도의 파일에 배치하는 것입니다 .
$ cat script.sed
s/,([^ ),]+)/,'\1'/g
s/,,/,'',/g
$ sed -rf script.sed file
INSERT INTO radcheck(id, username, attribute, op, value) VALUES (,'','00:23:32:c2:a9:e8','Auth-Type',':=','Accept');
이 방법은 sed
쉘의 간섭없이 직접 명령 을 읽는 강력한 장점이 있습니다. 결과적으로 이것은 쉘 활성 문자를 이스케이프 할 필요를 완전히 피하고 명령을 순수한 sed
구문 으로 입력 할 수 있도록 합니다.
sed
솔루션 작동트릭은 원하는 쉼표로 구분 된 문자열을 작은 따옴표로 묶지 만 다른 문자열은 묶지 않는 것입니다. 귀하가 제공 한 단일 예를 기반으로 한 방법은 다음과 같습니다.
s/,([^ ),]+)/,'\1'/g
이것은 쉼표 뒤에 오는 하나 이상의 공백, 쉼표 및 괄호를 닫지 않는 문자를 찾습니다. 이러한 문자는 작은 따옴표 안에 배치됩니다.
s/,,/,'',/g
연속 된 쉼표를 찾고 그 사이에 두 개의 작은 따옴표를 넣습니다.
추가 백 슬래시를 피하기 위해 위의 sed
표현식은 확장 정규 표현식을 사용합니다. GNU를 사용하면 다음과 같이 호출 -r
되지만 BSD에서는 -E
. 또한 일부 비 GNU sed
는 세미콜론으로 구분 된 여러 명령을 허용하지 않습니다. 따라서 OSX에서 다음을 시도하십시오.
sed -E -e "s/,([^ ),]+)/,'\1'/g" -e "s/,,/,'',/g" file
주석에서 다음과 같은 입력이 있습니다.
$ cat file3
INSERT INTO radcheck(username, attribute, op, value) VALUES (00:23:32:c2:a9:e8,'Auth-Type',':=','Accept');
그리고 열린 괄호 뒤에 오는 MAC 주소를 작은 따옴표로 묶어야합니다. 하기 위해서:
$ sed -r "s/\(([[:xdigit:]:]+)/('\1'/" file3
INSERT INTO radcheck(username, attribute, op, value) VALUES ('00:23:32:c2:a9:e8','Auth-Type',':=','Accept');
모든 로케일에서 [:xdigit:]
모든 16 진수와 일치합니다. 따라서 ([[:xdigit:]:]+)
MAC 주소 (16 진수 또는 콜론)와 일치합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다