出力は次のとおりです。
/var/data/run/stores/user.rstd/info.settings:4: Password = "xxxxxxx";
この例では、「user」と「Password」(「xxxxxxx」;)の値を新しいファイルにリダイレクトする必要があります。 「Users」は常に5番目のディレクトリにありますが、.rstd拡張子は必要ありません。私の新しいファイル出力は次のようになります
user "xxxxxxxx";
どうすればこれを行うことができますか?
答え1
sedを使う
便宜上、find出力をシェル変数に入れますs
。
$ s='/var/data/run/stores/user.rstd/info.settings:4: Password = "xxxxxxx";'
それでは、必要な部分を抽出してみましょう。
$ echo "$s" | sed -E 's|/([^/]*/){4}([^/.]*)[.][^"]*(.*)|\2 \3|'
user "xxxxxxx";
どのように動作しますか?
sed スクリプトは単一の代替コマンドで構成されます。この-E
フラグは拡張正規表現を有効にします。
この行は次のとおりです。
/([^/]*/){4}([^/.]*)[.][^"]*(.*)
/([^/]*/){4}
最初の4つのディレクトリと一致します。これらのディレクトリの最後のディレクトリは、括弧のためにグループ1として保存されますが、私たちはそれを使用しません。([^/.]*)
拡張子のないユーザー名と一致します。括弧があるため、グループはグループ2として保存されます。[.][^"]*
拡張子と最初の二重引用符の前のすべての項目と一致します。(.*)
最初の二重引用符から行末までのすべての項目と一致します。今回も角かっこでグループ3として保存されます。代替テキスト
\2 \3
は、グループ2、スペース、グループ3を表します。
awkを使う
$ echo "$s" | awk -v FS="/" '{ name=$6; sub(/[.].*/,"", name); sub(/[^"]*/, ""); print name, $0;}'
user "xxxxxxx";
どのように動作しますか?
-v FS="/"
これにより、フィールド区切り記号がに設定されます
/
。name=$6; sub(/[.].*/,"", name)
awkはフィールド数を数えるので、名前は6番目のフィールドにあります。 6番目のフィールドを変数に保存し
name
、name
最初の期間以降のすべての項目を削除します。sub(/[^"]*/, "")
これにより、最初の行を除く行のすべての項目が削除されます
"
。print name, $0
これにより、名前、フィールド区切り文字(デフォルトでは空白)、および置換後の行に残った内容(パスワード)が印刷されます。
答え2
グループ化を使用してこれを行うことができますsed
。
$ echo '/var/data/run/stores/user.rstd/info.settings:4: Password = "xxxxxxx";' | \
sed 's,\(^/var.*stores/\)\(user\)\(.rstd.*= \)\(.*\),\2 \4,'
user "xxxxxxx";
奇妙に思えることを知っています;)またはより簡単な方法を使用することもできます
sed -e 's,/var/data/run/stores/,,;s,\..*=,,'
答え3
とても長いですが…うまくいくようです。
$ echo '/var/data/run/stores/user.rstd/info.settings:4: Password = "xxxxxxx";' | \
awk -F/ ' { print $6 $7} ' | awk -F"." ' { print $1, " ", $3 } ' | \
awk ' { print $1 " " $NF } '
user "xxxxxxx";
答え4
使用真珠
~$ perl -pe 's{^(\/[^/]+){4}\/(\w+)\.rstd\/[^/ ]+\hPassword\h\=\h\"(.+)\"}{$2 $3};' file
#OR (with \x option)
~$ perl -pe 's{ ^ ( \/ [^/]+ ){4} \/ (\w+) \. rstd \/ [^/ ]+ \h Password \h \= \h \" (.+) \" }{$2 $3}x;' file
使用幸せ(以前のPerl_6)
~$ raku -pe 's{ ^ [ \/ <-[ / ]>+ ]**4 \/ (\w+) \. rstd \/ <-[ / \h ]>+ \h Password \h \= \h \" (.+) \" } = "$0 $1";' file
#OR (much more explicitly)
~$ raku -pe 's{ ^ [ \c[SOLIDUS] <-[ \c[SOLIDUS] ]>+ ]**4 \c[SOLIDUS] (\w+) \.rstd \c[SOLIDUS] <-[ \c[SOLIDUS] \c[SPACE] ]>+ \c[SPACE] Password \c[SPACE] \= \c[SPACE] \c[QUOTATION MARK] (.+) \c[QUOTATION MARK] } = "$0 $1";' file
入力例:
/var/data/run/stores/user.rstd/info.settings:4: Password = "xxxxxxx";
出力例(すべて4例):
user xxxxxxx;
Perlリファレンス:
https://perldoc.perl.org/perlrequick
https://perldoc.perl.org/perlre
Leku参考資料:
https://docs.raku.org/言語/regexes
https://docs.raku.org/言語/regexes-best-practices