名前に "/"を含む行間の行を印刷する必要があります。私は以前試しました:
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
文字値とともに使用されます/
(\57
ASCIIベースのシステム、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/