ファイルからすべてのディレクトリタグを取得しました。これで、以下のように、個々のディレクトリタグ全体を別の変数に保存したい状況に収まりました。よろしくお願いします。
私が得るものは次のとおりです。
<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
それぞれに1つずつ追加しますprint
。-n
入力ファイルを1行ずつ読み込み(上記でこのコンテキストで「行」が何を意味するかを参照)、指定されたスクリプトを各行-e
に適用します。print "var" . ++$k . "=\"$_\""
:希望の出力形式を印刷します。var
文字列と処理された各行に対して増加する数字(++$k
)、次に=\"
(二重引用符で囲まれた文字列内にある"
ため、エスケープが必要です)、現在の「行」()を閉じて印刷します。\"
$_
"
. <(perl ...)
:.
提供されたファイルを読み取り、現在のセッションでその内容を実行するソースコマンド。<()
~と呼ばれるプロセスの交換、デフォルトではコマンドの出力をファイルとして扱うことができます。すべてのシェルがこの機能をサポートしているわけではありません。したがって、シェルがサポートしていない場合は、出力をファイルに保存してからファイルをインポートする必要があります。