다음 내용이 포함된 파일(Data.txt)이 있습니다.
A=1234597890 B=192.168.1.1
B가 먼저 가는 경우도 있고, A나 B만 가는 경우도 있습니다.
그래서 내가 찾은 경우 :
A, Print A content and execute A script
B, " B " " " B "
A&B, " A&B " " " A "
Neither, Print a error message
이제 문제는 A와 B의 내용이 항상 다르다는 것입니다!
어떤 명령을 사용하는 것이 가장 좋은지 모르겠습니다.
도와주셔서 감사하고 제 기본 영어를 이해하려고 노력해 주셔서 감사합니다 :)!
답변1
Perl에서는 다음과 같이 할 수 있습니다.
$ perl -lne 'if(/A=([^\s]+)/){print "A : $1"; `scriptA.sh`}
if(/B=([^\s]+)/){print "B : $1"; `scriptB.sh`}' Data.txt
설명하다
-lne
print
: 각 입력 줄에서 후행 줄 바꿈을 제거하고 각 호출에 줄 바꿈을 추가합니다(-l
). 파일을 한 줄씩 읽고( )-n
각 줄에 제공된 스크립트를 실행합니다.-e
if(/A=([^\s]+)/){print "A : $1"; `scriptA.sh`}
: 이 줄이 일치하는A=
항목이 있으면 인쇄하고A : something
(대괄호는 패턴이 캡처되어 이제 로 저장되었음을 나타냄$1
) 를 실행합니다scriptA
.if(/B=([^\s]+)/){print "B : $1"; `scriptB.sh`}
: 위와 같지만 B의 경우입니다.
또는 값을 추출하여 구문 분석할 수 있습니다.
$ grep -Po '[AB]=[^\s]+' Data.txt |
while IFS="=" read name val; do
echo "$name=$val";
[ "$name" = "A" ] && scriptA.sh || scriptB.sh;
done
설명하다
grep -Po '[AB]=[^\s]+' Data.txt
:-P
할 수 있게 하다PCRE, 그리고 각 일치 항목이 다른 줄에 인쇄되도록-o
합니다 . "A 또는 B와 일치하고 그 다음 공백이 아닌 문자를 최대한 많이 일치시키는 것을grep
의미합니다 . 출력은 각각 한 줄에 있는 입력 파일의 전체 세트입니다 .[AB]=[^\s]+
=
A=foo
B=bar
while IFS="=" read name val
: 이온 입력 필드 구분자를 설정=
하고 두 개의 변수를 읽습니다. 이는 그들과 관련된 가치 가$name
될 것임을 의미 합니다.A
B
$value
echo "$name=$val";
:원하는 대로 형식을 변경하여 인쇄하세요.[ "$name" = "A" ] && scriptA.sh || scriptB.sh;
:$name
그렇다면A
실행하고scriptA.sh
, 그렇지 않으면 실행합니다scriptB.sh
. 위의 두 솔루션 모두 호출하려는 스크립트가 $PATH에 있다고 가정scriptA.sh
합니다scriptB.sh
. 적절하게 편집하십시오.