字段分隔符 - 故障分隔命令字符

时间:2017-11-11 15:29:59

标签: awk

我正在尝试解析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}'

我尝试使用\字符转义违规字符串的一个,全部和每个组合。但是,没有任何工作。

1 个答案:

答案 0 :(得分:2)

这可能是您正在寻找的内容:

'foo'bar'

在shell中,始终在单引号中包含字符串(和命令行脚本),除非您需要使用双引号将字符串内容暴露给shell,例如让shell扩展变量。

对于每个shell规则,不能在单引号分隔的字符串'中包含单引号(不会有任何反斜杠用于转义中间字符串'foo'\''bar')所以你需要从单引号中跳回来提供单引号,然后再返回,例如使用\047或使用八进制转义序列'foo\047bar'(不要使用十六进制等效项,因为它容易出错),无论您想要单引号,例如)。然后你需要两次转义override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) setFullScreen(on: fullScreen, animated: animated) } override var prefersStatusBarHidden: Bool { return fullScreen } override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } @IBAction func onToggleNavBarVisibility(_ sender: Any) { if let navBarHidden = self.navigationController?.isNavigationBarHidden { // Toggle the state fullScreen = !navBarHidden setFullScreen(on: fullScreen, animated: true) } } private func setFullScreen(on : Bool, animated : Bool) { self.navigationController?.setNavigationBarHidden(on, animated: animated) self.setNeedsStatusBarAppearanceUpdate() } - 一次是因为awk将字符串转换为正则表达式,然后当awk将其用作正则表达式时再次转义。

如果您在字符串周围使用双引号,那么在shell解析字符串时需要一个额外的转义,但是当您用单引号括起字符串时不需要它,因为这会阻塞shell解析字符串。