파일에서 모든 디렉토리 태그를 얻었습니다. 이제 아래와 같이 전체 개별 디렉터리 태그를 다른 변수에 저장하고 싶은 상황에 봉착했습니다. 미리 감사드립니다.
내가 얻는 것은 다음과 같습니다.
<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 ...)
:.
제공한 파일을 읽고 현재 세션에서 해당 내용을 실행하는 소스 명령입니다.<()
~라고 불리는프로세스 교체, 기본적으로 명령의 출력을 파일로 처리할 수 있습니다. 모든 쉘이 이 기능을 지원하는 것은 아닙니다. 따라서 쉘이 지원하지 않는 경우 출력을 파일에 저장한 다음 파일을 가져와야 할 수도 있습니다.