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

"/"が名前の一部である場合、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)'

答え2

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

レコード間の/パターンを置き換えて(およびそのパターンを含むレコード)印刷できます。\57

でも読んでください範囲式を使用する前に

$ echo 'foo/bar was here' | awk '/foo\57bar/'
foo/bar was here

答え3

awkで使用する場合正規表現定数スラッシュ文字は、周囲の区切り文字と区別するためにエスケープする必要があります。 GNU awkを例に挙げましょう。

$ echo 'foo/bar was here' | gawk '/foo/bar/'
awk: cmd. line:2: /foo/bar/
awk: cmd. line:2:          ^ unexpected newline or end of string

しかし、

$ echo 'foo/bar was here' | gawk '/foo\/bar/'
foo/bar was here

また、この+文字はawkで使用される拡張正規表現(ERE)方言で特別な意味を持ち、リテラルプラス文字と一致させるにはエスケープする必要があります。だから:

/\+SOLUTION\/ESTIMATES/,/-SOLUTION\/ESTIMATES/

関連情報