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

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

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

내가 얻는 것은 다음과 같습니다.

<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각각에 대해 하나씩 추가합니다 print. -n입력 파일을 한 줄씩 읽고 (위에서 이 문맥에서 "줄"이 무엇을 의미하는지 참조) 지정된 스크립트를 -e각 줄에 적용합니다.
  • print "var" . ++$k . "=\"$_\"":원하는 출력 형식을 인쇄합니다. var문자열과 처리된 각 줄에 대해 증가하는 숫자( ++$k), 그런 다음 =\"( 큰따옴표로 묶인 문자열 안에 있기 "때문에 이스케이프가 필요함 ) 및 현재 "줄"( )을 닫아 인쇄합니다 .\"$_"
  • . <(perl ...): .제공한 파일을 읽고 현재 세션에서 해당 내용을 실행하는 소스 명령입니다. <()~라고 불리는프로세스 교체, 기본적으로 명령의 출력을 파일로 처리할 수 있습니다. 모든 쉘이 이 기능을 지원하는 것은 아닙니다. 따라서 쉘이 지원하지 않는 경우 출력을 파일에 저장한 다음 파일을 가져와야 할 수도 있습니다.

관련 정보