
パターンのあるファイルがあります。
<span class="WebRupee">Rs.</span>\n29\n<br/><font style="font-size:smaller;font-weight:normal">\n3 days\n</font></td>, <td class="pricecell"><span class="WebRupee">Rs.</span>\n59\n<br/><font style="font-size:smaller;font-weight:normal">\n7 days\n</font></td>, <td class="pricecell"><span class="WebRupee">Rs.</span>\n99\n<br/><font style="font-size:smaller;font-weight:normal">\n12 days\n</font></td>
私が望む値は29、3日、59などです。
デフォルトでは、間の値\n value \n
私はいくつか見ましたが、\ n文字をエスケープする方法がわかりません。
私は試しました: -grep -o '\n.*\n' o.txt
しかし成功しませんでした。
答え1
Grep は\n
改行文字を改行文字として解釈します。ファイルに改行文字がないようです。文字通りのバックスラッシュを検索するには、次のよう\
にn
2倍にする必要があります。
$ grep -o '\\n[^\\]*\\n' o.txt
\n29\n
\n3 days\n
\n59\n
\n7 days\n
\n99\n
\n12 days\n
GNU grepを使用すると、出力を簡単に整理して削除できます\n
。
$ grep -oP '(?<=\\n)[^\\<>]*(?=\\n)' o.txt
29
3 days
59
7 days
99
12 days
ここで(?<=\\n)
LookBehindの主張は、(?=\\n)
私たちが一致するテキストを囲むことを要求するLookaheadの主張です\n
。 grepは重複しない一致を返しますが、ここで1つの微妙な点は、後ろ向きと前のビューが同じであることです。いいえゲームに含まれています。これにより、私たちが望んでいないテキストも囲まれているという問題が発生します\n
。たとえば、o.txtでは文字が\n<br/><font style="font-size:smaller;font-weight:normal">\n
囲まれています\n
。これらの文字列を削除するには、一致するテキストから除外するだけ\
でなく除外する必要があります。 <
>
GNU grepがない場合のもう1つのオプションは、それを使用して出力sed
をクリーンアップすることです。
$ grep -o '\\n[^\\]*\\n' o.txt | sed 's/\\n//g'
29
3 days
59
7 days
99
12 days
別のオプションはawkを使用することです。
$ awk '0==NR%2' RS='\\\\n' o.txt
29
3 days
59
7 days
99
12 days
ここで、awkは\
末尾をn
レコード区切り文字として使用し、偶数レコードのみを印刷します。