모든 디렉토리 태그를 다른 변수에 넣는 방법

모든 디렉토리 태그를 다른 변수에 넣는 방법

파일에서 모든 디렉토리 태그를 가져왔습니다. 이제 아래와 같이 전체 개별 디렉터리 태그를 다른 변수에 저장하려는 상황에 봉착했습니다. 미리 감사드립니다.

아래는 제가 가져온 것입니다:

<Directory />
    AllowOverride none
    Order deny, allow
    Deny from all
</Directory>
<Directory "/var/www">
    AllowOverride None
    Require all granted
</Directory>

필수의:

# echo $var1
<Directory /> 
AllowOverride none 
Order deny, allow 
Deny from all 
</Directory>

# echo $var2
<Directory "/var/www"> 
AllowOverride None  
Require all granted 
</Directory>

참고: 디렉토리 태그가 2개만 있는 것이 아니라, 사이에 공백이 없는 디렉토리 태그가 많이 있습니다. 모든 전체 개별 디렉터리는 별도의 변수에 저장되어야 합니다.

미리 감사드립니다

답변1

파일의 줄을 반복하고 태그가 나타날 때까지 문자열에 새 줄을 추가할 수 있습니다 </Directory>.

태그 만 있으면 Directory코드가 훨씬 간단해집니다. 가지고 있는 태그 수를 모르는 경우에는 varX사용하면서 변수를 선언해야 합니다 .declare

STR=""
i=1
DIRTAG=false
while read -r LINE; do
    if grep -q '^<Directory' <<< $LINE; then
        DIRTAG=true
    fi
    if $DIRTAG; then
        STR+="$LINE
"
    fi
    if grep -q '^</Directory>' <<< $LINE; then 
        declare var$i="\"\"\"$STR\"\"\"" #You're not clear on the quotes
        STR=""   
        i=$((i+1))
        DIRTAG=false
    fi
done < t.txt

이제 echo "$var1"; echo "$var2"다음을 출력합니다(큰따옴표를 잊지 마십시오. 그렇지 않으면 인쇄된 출력에서 ​​개행 문자는 공백이 됩니다)

"""<Directory />
AllowOverride none
Order deny, allow
Deny from all
</Directory>
"""
"""<Directory "/var/www">
AllowOverride None
Require all granted
</Directory>
"""

태그 개수를 모르는 경우 이를 사용하여 생성된 변수를 반복할 수 있습니다.

for j in `seq 1 $((i-1))`; do
    var=var$j
    echo "${!var}"
done

답변2

파일을 처리하여 변수 정의 목록으로 변환한 다음 이를 소싱할 수 있습니다. 예를 들어, 각 닫는 </Directory>태그 뒤에 빈 줄을 추가한 다음 Perl의 단락 모드를 사용하여 각 항목을 단일 줄로 읽을 수 있습니다.

$ sed 's|</Directory>|</Directory>\n|' file | 
    perl -000 -lne 'print "var" . ++$k . "=\"$_\"";' 
var1="<Directory />
    AllowOverride none
    Order deny, allow
    Deny from all
</Directory>"

var2="<Directory "/var/www">
    AllowOverride None
    Require all granted
</Directory>"

그리고 이를 직접 소싱하여 현재 셸에서 실제로 변수를 설정할 수 있습니다.

$ . <(sed 's|</Directory>|</Directory>\n|' file | 
    perl -000 -lne 'print "var" . ++$k . "=\"$_\"";' file )

$ echo "$var1"
<Directory />
    AllowOverride none
    Order deny, allow
    Deny from all
</Directory>

$ echo "$var2"
<Directory /var/www>
    AllowOverride None
    Require all granted
</Directory>

설명

  • sed s|</Directory>|</Directory>\n|' file: 각 닫는 태그 뒤에 줄바꿈을 추가합니다 </Directory>.
  • -000: 이것은 "라인"이 두 개의 연속된 개행 문자, 기본적으로 빈 라인으로 정의되는 Perl의 "단락 모드"를 켭니다. 따라서 실제 줄 대신 각 "줄"이 이제 단락이 됩니다. 이렇게 하면 < Directory />각 항목이 빈 줄로 구분되므로 시작과 끝 사이의 모든 내용을 단일 줄로 처리할 수 있습니다 .
  • -lne: -l후행 줄 바꿈을 제거하고 \n각각에 a를 추가합니다 print. 는 -n입력 파일을 한 줄씩 읽고(이 문맥에서 "줄"이 의미하는 바는 위 참조) -e각 줄에 제공된 스크립트를 적용합니다.
  • print "var" . ++$k . "=\"$_\"": 원하는 출력 형식을 인쇄합니다. 문자열 var뒤에는 처리된 각 줄에 대해 증가되는 숫자( ++$k)가 옵니다. 그런 다음 =\"( 큰따옴표로 묶인 문자열 내에 있으므로 "이스케이프해야 함 \") 현재 "줄"( $_)이 이어집니다. 마감까지 ".
  • . <(perl ...): 이 .소스 명령은 사용자가 제공한 파일을 읽고 현재 세션에서 해당 내용을 실행합니다. 라고<()프로세스 대체, 본질적으로 명령의 출력을 마치 파일인 것처럼 처리할 수 있습니다. 모든 쉘이 이를 지원하는 것은 아니므로, 그렇지 않은 경우 출력을 파일에 저장한 다음 해당 파일의 소스를 지정해야 할 수도 있습니다.

관련 정보