如何提取文件中两个\n之间的字符串

pen*_*nta 7 grep bash shell-script quoting

我有一个带模式的文件

    <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>
Run Code Online (Sandbox Code Playgroud)

我想要值 29、3 天、59 等。

基本上之间的价值 \n value \n

我咨询了很多地方,但我不知道如何转义 \n 字符。

我试过了:-grep -o '\n.*\n' o.txt 但没有用

Joh*_*024 9

Grep 解释\n为换行符。看起来您的文件没有换行符,\后面跟着n. 要搜索文字反斜杠,您必须将它们加倍:

$ grep -o '\\n[^\\]*\\n' o.txt
\n29\n
\n3 days\n
\n59\n
\n7 days\n
\n99\n
\n12 days\n
Run Code Online (Sandbox Code Playgroud)

使用 GNU grep,可以轻松清理输出以删除\n

$ grep -oP '(?<=\\n)[^\\<>]*(?=\\n)' o.txt
29
3 days
59
7 days
99
12 days
Run Code Online (Sandbox Code Playgroud)

这里,(?<=\\n)是一个后视断言,(?=\\n)是一个前瞻断言,要求我们匹配的文本被 包围\n。虽然 grep 返回非重叠匹配,但这里的一个微妙之处在于后视和超前计入匹配。这给我们留下了一个问题,即我们不想要的文本也被\n. 例如,在 o.txt 中,字符\n<br/><font style="font-size:smaller;font-weight:normal">\n\n. 为了消除这些字符串,我们要求匹配的文本不仅排除\而且排除<>

如果我们没有 GNU grep,另一种选择是sed用来清理输出:

$ grep -o '\\n[^\\]*\\n' o.txt | sed 's/\\n//g'
29
3 days
59
7 days
99
12 days
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用 awk:

$ awk '0==NR%2' RS='\\\\n' o.txt
29
3 days
59
7 days
99
12 days
Run Code Online (Sandbox Code Playgroud)

在这里,awk 使用\后跟n作为记录分隔符,我们只打印偶数记录。