次の形式の複数のリンクを含む複数のファイルがあります。
<a href="http://example.com/fnord.layername.html?parameter=FOO-_-BAR-_-FNORD" class="poit">
<img ... />
</a>
異なる場合FOO
がありますので参考にしてください。BAR
FNORD
さて、これらすべてのファイルに正しい属性が設定されていることを確認したいと思います。これには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 EXPR
ack-grepの引数を使用して、行の一部のみを選択的に印刷できます。 ack-grep は Perl スクリプトで、EXPR 引数は Perl 式だけであることを覚えておいてください。この場合、パターンマッチングで?行の一部のみを取得するために括弧を使用しています。最後まで"(やはり正規表現のメタ文字「?」を引用するためにバックスラッシュを使用しましたが、正規表現の最初の文字として機能することもできますが、そうしませんでした)。
ack-grep -a --output '$1' '\?(parameter=.*?)"'
最後のものを見ましたか? .*正規表現は貪欲ではないので、行の最後の代わりに最初の"と一致します。
これにより、次の出力ラインが生成されます。 ack-grepの引数を使用して先行1を抑制できます1:parameter=FOO-_-BAR-_-FNORD
。-h
答え2
ack-grep
Macにユーティリティがありませんが、この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