Bash

如何提取文件中兩個n之間的字元串

  • July 24, 2016

我有一個帶有模式的文件

   <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 但它沒有用

Grep 解釋\n為換行符。看起來您的文件沒有換行符,它\後面跟著n. 要搜尋文字反斜杠,您必須將它們加倍:

$ 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)是一個後視斷言,(?=\\n)是一個前瞻斷言,要求我們匹配的文本用\n. 雖然 grep 返回不重疊的匹配,但這裡的一個微妙之處在於,後瞻和前瞻計入匹配。這給我們留下了一個問題,我們不想要的文本也被\n. 例如,在 o.txt 中,字元由 .\n<br/><font style="font-size:smaller;font-weight:normal">\n包圍\n。為了消除這些字元串,我們要求匹配的文本不僅要排除,\還要排除<and >

如果我們沒有 GNU grep,另一種選擇是用於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作為記錄分隔符,我們只列印偶數記錄。

引用自:https://unix.stackexchange.com/questions/297861