すべてのディレクトリタグを異なる変数に入れる方法

すべてのディレクトリタグを異なる変数に入れる方法

ファイルからすべてのディレクトリ タグを取得しました。現在、以下に示すように、個々のディレクトリ タグ全体を異なる変数に保存したいという状況に陥っています。よろしくお願いします。

以下は私が取得したものです:

<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 ...): は.ソースコマンドで、与えられたファイルを読み込み、現在のセッションでその内容を実行します。<()プロセス置換基本的に、コマンドの出力をファイルのように扱うことができます。すべてのシェルがこれをサポートしているわけではないので注意してください。サポートしていない場合は、出力をファイルに保存してから、そのファイルをソースにする必要があるかもしれません。

関連情報