쉘 변수에서 명령 뒤의 매개변수(대괄호 사이)를 캡처합니다.

쉘 변수에서 명령 뒤의 매개변수(대괄호 사이)를 캡처합니다.

다른 콘텐츠가 많이 포함된 파일이 있다고 가정해 보겠습니다.

\명령{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

관련 정보