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

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

我有一个带有模式的文件

    <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.要搜索文字反斜杠,必须将它们加倍:

$ 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。为了消除这些字符串,我们要求匹配文本不仅排除\而且排除<>

如果我们没有 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作为记录分隔符,我们只打印偶数记录。

相关内容