
私は短いbashパーサーを作成し、いくつかの行から3つを抽出して、新しくフォーマットされた変数に入れようとしています。形式は次のとおりです。
ownername:read write execute groupname:read execute all:none sticky
各部分を次の変数に入れようとします。
所有者(最初のブロック)
OWNER=$(ownername)
グループ(2番目のブロック)
GROUP=$(groupname)
最後に、権限(所有者名/グループ名を除くすべてのブロックが所有者と基本グループに置き換えられます)
PERMISSIONS=$(owner:read write execute primary_group:read execute all:none sticky)
最初は非常に単純な作業のように見えましたが、一部の領域はrwxで、他の領域はrw / roであり、所有者/グループが一意ではないため、基本的なawkの知識でこの問題を解決することは困難でした(単純なsedは許可されていません)。
この問題を解決するには、どの初期ステップを実行する必要がありますか?
より明確に言えば:
入力する:
ownername:read write execute groupname:read execute all:none sticky
出力:
OWNER=ownername
GROUP=groupname
PERMISSIONS=owner:read write execute primary_group:read execute all:none sticky
答え1
入力を単一の単語、コロン、その他の単語を含む部分に分割したいと思います。セクションを分離すると簡単になりますが、たとえば、次のような区切り文字を追加できます。
echo "ownername:read write execute groupname:read execute all:none sticky" | \
sed -e 's/\w\w*:/;&/g'
;ownername:read write execute ;groupname:read execute ;all:none sticky
セミコロンで分割すると動作します。
部品を配列に直接分割するために必要なPerlフラグメント:
echo "ownername:read write execute groupname:read execute all:none sticky" | \
perl -ne '@a = split/ (?=\w+:)/; print "$_\n" for @a'
ownername:read write execute
groupname:read execute
all:none sticky