我有一个带有模式的文件
<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
作为记录分隔符,我们只打印偶数记录。