ファイル名のみを収集してパラメータを取得するように出力を切り取るにはどうすればよいですか?

ファイル名のみを収集してパラメータを取得するように出力を切り取るにはどうすればよいですか?

次の形式の複数のリンクを含む複数のファイルがあります。

<a href="http://example.com/fnord.layername.html?parameter=FOO-_-BAR-_-FNORD" class="poit">
    <img ... />
</a>

異なる場合FOOがありますので参考にしてください。BARFNORD

さて、これらすべてのファイルに正しい属性が設定されていることを確認したいと思います。これにはack-grepとcutを使いたいです。

ack-grep -a ?parameter= *.txt

出力を取得します。

fileName.txt
1:<a href="http://example.com/fnord.layername.html?parameter=FOO-_-BAR-_-FNORD" class="poit">

fileName2.txt
5:<a href="http://example.com/fnord.layername.html?parameter=POIT-_-NARF-_-BAZINGA" class="poit">

しかし、私は出力を減らして次のように見えるようにする方法を知りません。

fileName.txt
parameter=FOO-_-BAR-_-FNORD

fileName2.txt
parameter=POIT-_-NARF-_-BAZINGA

答え1

--output EXPRack-grepの引数を使用して、行の一部のみを選択的に印刷できます。 ack-grep は Perl スクリプトで、EXPR 引数は Perl 式だけであることを覚えておいてください。この場合、パターンマッチングで?行の一部のみを取得するために括弧を使用しています。最後まで"(やはり正規表現のメタ文字「?」を引用するためにバックスラッシュを使用しましたが、正規表現の最初の文字として機能することもできますが、そうしませんでした)。

ack-grep -a --output '$1' '\?(parameter=.*?)"'

最後のものを見ましたか? .*正規表現は貪欲ではないので、行の最後の代わりに最初の"と一致します。

これにより、次の出力ラインが生成されます。 ack-grepの引数を使用して先行1を抑制できます1:parameter=FOO-_-BAR-_-FNORD-h

答え2

ack-grepMacにユーティリティがありませんが、このawkソリューションが役に立ちますか?

awk -v FS=[?\"] '/param/{print FILENAME; print $3 }' INPUT_FILE

実装する:

[jaypal:~/Temp] cat file0
<a href="http://example.com/fnord.layername.html?parameter=FOO-_-BAR-_-FNORD" class="poit">
    <img ... />
</a>

[jaypal:~/Temp] awk -v FS=[?\"] '/param/{print FILENAME; print $3 }' file0
file0
parameter=FOO-_-BAR-_-FNORD

あなたに適したソリューション:

ファイル名とパラメータ値をインポートすることが重要な場合は、単純なコマンドで実行したり、現在のインポートされた出力をファイルにリダイレクトしたり、次のコードを1行にfor loopパイプしたりできます。awk

シンプルな for ループ:

[jaypal:~/Temp] for i in ./file*.txt; do awk -v FS=[?\"] '/param/{print FILENAME; print $3"\n" }' "$i"; done
./file01.txt
parameter=FOO-_-BAR-_-FNORD

./file02.txt
parameter=POIT-_-NARF-_-BAZINGA

現在の出力をファイルにリダイレクトして呼び出しますawk

次の例では、redirection現在次のディレクトリに出力しているとします。一時ファイル

[jaypal:~/Temp] cat temp.file 
fileName.txt
1:<a href="http://example.com/fnord.layername.html?parameter=FOO-_-BAR-_-FNORD" class="poit">

fileName2.txt
5:<a href="http://example.com/fnord.layername.html?parameter=POIT-_-NARF-_-BAZINGA" class="poit">

[jaypal:~/Temp] awk -v FS=[?\"] 'NF==1{ print $0 }/param/{ print $3"\n" }' temp.file 
fileName.txt
parameter=FOO-_-BAR-_-FNORD

fileName2.txt
parameter=POIT-_-NARF-_-BAZINGA

答え3

私が理解しているかどうかはわからず、ack-grepユーティリティに精通していません。しかし、最初に発生する部分から切り取ってみてはいかがでしょうか?到着する」?

このように:

読みやすくするために、htmlタグを変数に入れました。

var='<a href="http://example.com/fnord.layername.html?parameter=FOO-_-BAR-_-FNORD" class="poit">'

cut -d '?' -f 2- <(echo $var ) | cut -d '"' -f 1

関連情報