![쉘 변수에서 명령 뒤의 매개변수(대괄호 사이)를 캡처합니다.](https://linux55.com/image/47169/%EC%89%98%20%EB%B3%80%EC%88%98%EC%97%90%EC%84%9C%20%EB%AA%85%EB%A0%B9%20%EB%92%A4%EC%9D%98%20%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98(%EB%8C%80%EA%B4%84%ED%98%B8%20%EC%82%AC%EC%9D%B4)%EB%A5%BC%20%EC%BA%A1%EC%B2%98%ED%95%A9%EB%8B%88%EB%8B%A4..png)
다른 콘텐츠가 많이 포함된 파일이 있다고 가정해 보겠습니다.
\명령{arg1, arg2, arg3}
(파라미터는 경로이며, /
, .
, 문자, 숫자로 표시됩니다)
하지만 사용자는 다음을 사용할 수도 있습니다.
\command{arg1,
arg2 ,
arg3
}
즉, 추가 공백이 있는 여러 줄입니다.
n개의 변수에 n개의 매개변수가 포함되도록 쉘 스크립트에 포함된 일반 패턴을 찾고 싶습니다. 어떻게 진행하나요?
나는 글을 쓰는 데 성공했다
echo "\command{arg1,
arg2 ,
arg3
}" | sed -n -e 's/\\command//p' | sed 's/,/\n/' | sed 's/{\|}//'
하지만 이것은 출력만 가능 arg1
하며 이를 변수에 저장하는 방법조차 모르겠습니다.
관련된:
하지만 이 모든 재료를 조합하여 내가 원하는 것을 얻을 수는 없습니다.
답변1
n개의 변수에 n개의 매개변수가 포함되도록 쉘 스크립트에 포함된 일반 패턴을 찾고 싶습니다.
다음은 arglist
각 매개변수를 포함하는 쉘 배열을 생성합니다.
$ readarray -t arglist < <(echo "\command{arg1,
arg2 ,
arg3
}" | sed -n '/\\command/{ :a;/}/!{N;b a}; s/\\command{//; s/[ \n}]//g; s/,/\n/g; p}')
이 명령문을 사용하면 declare
작동하는 것을 볼 수 있습니다.
$ declare -p arglist
declare -a arglist='([0]="arg1" [1]="arg2" [2]="arg3")'
다음은 한 줄에 매개변수가 있는 또 다른 예입니다.
$ readarray -t arglist < <(echo "\command{arg1, arg2, arg3, arg4}" | sed -n '/\\command/{ :a;/}/!{N;b a}; s/\\command{//; s/[ \n}]//g; s/,/\n/g; p}')
다시 말하지만 작동합니다.
$ declare -p arglist
declare -a arglist='([0]="arg1" [1]="arg2" [2]="arg3" [3]="arg4")'
공백은 < <(
매우 중요합니다. 프로세스 교체에서 입력을 리디렉션하고 있습니다. 공간이 없습니다. bash
완전히 다른 것을 시도할 것입니다.
어떻게 작동하나요?
이 sed
명령은 약간 미묘합니다. 한 번에 하나씩 살펴보겠습니다.
-n
명시적으로 요청하지 않는 한 줄을 인쇄하지 마세요.
/\\command/{...}
가 포함된 줄을 찾으면
\command
중괄호 안의 명령이 다음과 같이 실행됩니다.:a;/}/!{N;b a}
이는 포함된 line 을 찾을 때까지 패턴 버퍼로 행을 읽습니다
}
. 이렇게 하면 전체 명령을 한 번에 입력할 수 있습니다.s/\\command{//
\command{
로프를 제거하십시오 .s/[ \n}]//g
공백, 닫는 중괄호 및 개행 문자를 모두 제거하세요.
s/,/\n/g
쉼표를 줄 바꿈으로 바꾸십시오. 이 작업이 완료되면 각 매개변수는 우리가 원하는 별도의 줄에 표시됩니다
readarray
.p
인쇄.
답변2
그리고 perl
:
perl -l -0777 -ne '
$n = 0;
for (/\\command\{\s*(.*?)\s*\}/sg) {
$n++;
$i = 0;
for $arg (split /\s*,\s*/, $_) {
$arg =~ s/'\''/$&\\$&$&/g;
print "arg${n}[$i]='\''$arg'\''";
$i++;
}
}
print "n=$n"' the-file
출력은 다음과 유사합니다.
arg1[0]='arg1'
arg1[1]='arg2'
arg1[2]='arg3'
n=1
다음과 같이 평가할 수 있습니다.
eval "$(perl ...)"
각 s에 대해 $arg1
... 배열을 만듭니다.$arg2
\command