2017-11-11 240 views
0

我试图解析通过html源代码。在我的例子中,我只是在回应它。但是,我正在练习中从文件中读取html。字段分隔符 - 麻烦分隔命令字符

下面是一些代码,工程,语法:

echo "<td>Here</td> some dynamic text to ignore <garbage> is a string</table>more junk" | 
awk -v FS="(<td>|</td>|<garbage>|</table>)" '{print $2, $4}' 
在FS声明

我创建4个分隔符,其做工精细,和我输出2和第4场。

然而,第三场定界符我真正需要使用包含awk命令字,从字面上:

')"> 

,这样当我改变上述声明:

echo "<td>Here</td> some dynamic text to ignore ')\"> is a string</table>more junk" | 
awk -v FS="(<td>|</td>|')\">|</table>)" '{print $2, $4}' 

我试着将冒犯的字符串与\字符的一个,全部和每个组合进行转义。但是,没有任何工作。

+0

命令的预期输出不起作用是什么? –

+0

@Ed Morton的第一位代码返回预期的输出。第二个不是。已经将您的其他答复标记为解决方案。谢谢。 – James

+2

确定,但下次 - 实际显示您的问题的预期输出。 –

回答

2

这可能是你在找什么:

$ echo "<td>Here</td> some dynamic text to ignore ')\"> is a string</table>more junk" | 
awk -v FS='(<td>|</td>|\047\\)">|</table>)' '{print $2, $4}' 
Here is a string 

在外壳,始终在单引号的字符串(和命令行脚本),除非你需要使用双引号来暴露你的字符串内容到壳,例如让shell扩展一个变量。

每壳的规则,你不能包括分隔字符串'foo'bar'单引号内的单引号,但(没有反斜杠量将努力逃脱中间串'),所以你需要或者跳回了单引号提供一个单引号然后回来,例如与'foo'\''bar'或使用八进制转义序列\047(不要使用十六进制等效,因为它容易出错),无论你想要一个单引号,例如'foo\047bar'。然后您需要两次跳过)--一次用于awk将字符串转换为正则表达式,然后当awk将它用作正则表达式时。

如果你一直在字符串周围使用双引号,当shell解析字符串时需要一个额外的转义,但当你用单引号括住字符串时不需要这个转义,因为这是阻止shell解析字符串。

+1

就是这样。谢谢。在FS声明中使用双引号而不是单引号的组合,以及使用八进制代码的撇号。谢谢。 – James