ファイルからすべてのディレクトリ タグを取得しました。現在、以下に示すように、個々のディレクトリ タグ全体を異なる変数に保存したいという状況に陥っています。よろしくお願いします。
以下は私が取得したものです:
<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 の段落モードを使用して各エントリを 1 行として読み取ることができます。
$ 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 の「段落モード」をオンにします。このモードでは、「行」は 2 つの連続する改行文字 (基本的には空白行) によって定義されます。したがって、実際の行ではなく、各「行」が段落になります。これにより、各< Directory />
エントリが空白行で区切られるため、開始と終了の間のすべてを 1 行として扱うことができます。-lne
: は-l
末尾の改行を削除し、\n
各 に を追加しますprint
。 は-n
入力ファイルを 1 行ずつ読み取り (このコンテキストでの「行」の意味については上記を参照)、 で指定されたスクリプトを-e
各行に適用します。print "var" . ++$k . "=\"$_\""
: 希望する出力形式を出力します。文字列var
の後に、処理される行ごとに増加する数値 (++$k
) が続き、次に=\"
(二重引用符で囲まれた文字列内にあるため"
としてエスケープする必要があります\"
)、現在の「行」($_
) の後に閉じ が続きます"
。. <(perl ...)
: は.
ソースコマンドで、与えられたファイルを読み込み、現在のセッションでその内容を実行します。<()
はプロセス置換基本的に、コマンドの出力をファイルのように扱うことができます。すべてのシェルがこれをサポートしているわけではないので注意してください。サポートしていない場合は、出力をファイルに保存してから、そのファイルをソースにする必要があるかもしれません。