"/"が名前の一部である場合、awkは行間に印刷します。

名前に "/"を含む行間の行を印刷する必要があります。私は以前試しました:

awk '/+SOLUTION/ESTIMATES/,/-SOLUTION/ESTIMATES/' $F > fil$F

そして

awk '/+SOLUTION"/"ESTIMATES/,/-SOLUTION"/"ESTIMATES/' $F > fil$F

そして

awk '/"{+SOLUTION/ESTIMATES}"/,/"{-SOLUTION/ESTIMATES}"/' $F > fil$F

しかし、エラーは常に「終了していない文字列」とほぼ同じです。

このパターン間の線をどのように印刷できますか?

ベストアンサー1

/regex/yesの頭字語はとしても$0 ~ /regex/使用できます。$0 ~ "regex"/プレフィックスを追加してエスケープします。\または\octal文字値とともに使用されます/\57ASCIIベースのシステム、EBCDICベースのシステムなど)。\141、次のこともできます。

awk '$0 ~ "\\+SOLUTION/ESTIMATES", $0 ~ "-SOLUTION/ESTIMATES"' < "$F" > "fil$F"

+拡張正規表現演算子なので、 or でエスケープする必要が\+あります[+]\の構文でも特別な意味を持つので、aを正規表現エンジンに渡すために"strings"2倍にすることをお勧めします。\一部のawk実装では問題を解決できますが、"\+"すべてではありません。

可能であれば、ファイルパスを引数として渡すよりもリダイレクトを使用する方がよいでしょう。これにより、埋め込み(または以前のバージョンのbusyboxでは次に始まる)などの値がawkブロックされます。また、パラメータを引用するのを忘れたので、分割+グローブの影響を受けます。通常、リダイレクト先でパラメータ拡張を引用する必要はありません。ただし、ksh88と非POSIXモードのbashシェル(後者はまだ広く使用されています)を除いて、これを引用することをお勧めします。$F-=-awk$F

ここでは、正規表現の一致ではなく部分文字列検索を実行できます。

awk 'index($0, "+SOLUTION/ESTIMATES"), index($0, "-SOLUTION/ESTIMATES")' < "$F" > "$fil$F"

この行から印刷はい+SOLUTION/ESTIMATES正確にははい正確に-SOLUTION/ESTIMATES(または見つからない場合は入力の最後まで):

awk '$0 == "+SOLUTION/ESTIMATES", $0 == "-SOLUTION/ESTIMATES"' < "$F" > "$fil$F"

以下を使用して、perlより大きな柔軟性を提供します。

# regex, but with different delimiters (m@...@, m{...}...)
perl -ne 'print if m{\+SOLUTION/ESTIMATES} .. m{-SOLUTION/ESTIMATES}'
# regex but use \Q...\E regex quoting for anything inside to be taken literally:
perl -ne 'print if m{\Q+SOLUTION/ESTIMATES\E} .. m{-SOLUTION/ESTIMATES}'
# substring search with q(...) as strong quotes, same as '...' except
# easier to use inside shell '...' quotes.
perl -ne 'print if index($_, q(+SOLUTION/ESTIMATES)) >= 0 ..
                   index($_, q(-SOLUTION/ESTIMATES)) >= 0'
# string equality with eq
perl -lne 'print if $_ eq q(+SOLUTION/ESTIMATES) ..
                    $_ eq q(-SOLUTION/ESTIMATES)'

おすすめ記事