【问题标题】:sed command - branching to labelsed 命令 - 分支到标签
【发布时间】:2012-11-13 23:10:18
【问题描述】:

我无法获得与以下 SED 教程中给出的示例相同的输出,用于分支, http://www.grymoire.com/Unix/Sed.html#uh-59

这里引用代码:

#!/bin/sh
sed '
:again
    s/([ ^I]*)//
    t again
'

这个过滤器后面的空格仍然在括号中。

[更新] 这是我的输出:

$echo "( ( test ) )" | sed '
> :again
>      s/([ ]*)//
>      t again
> '
( ( test ) )
$

不应该是((test))吗? 如作者演示的,如何让脚本删除嵌套括号中的空格?

[/更新]

[更新2]

$echo " ( ( ) ) " | sed '
> :again
> s/\([ ]*\)//
> t again
> '

提示未返回。

[/UPDATE2]

另外我如何输入“^I”字符?我认为它是水平选项卡,但我无法像其他控制字符一样通过 puTTY 键入(例如,要获取“Enter”,我键入“Ctrl-V”,然后按“Enter”键,但这不是'不适用于标签)。我只尝试了空格(使用正则表达式[ ]* 而不是[ ^I]*),但这也失败了。

【问题讨论】:

  • 您的实际要求是什么。我不清楚你的问题。
  • 不要浪费你的时间。 sed 是用于在单行上进行简单替换的出色工具,但对于其他任何事情,我们只需要 awk。无论您发布的 sed 脚本打算做什么,都可以使用 awk 更清晰、更简单、更可扩展地完成。
  • @user1011046:将问题更新为更具体。
  • 谢谢你,你可能是对的。但我只是想了解 sed 的语法如何用于分支。
  • 我相信它涉及一个五角星、3 个辅音、4 个标点符号和蝙蝠侠符号。祝你好运!

标签: unix sed aix


【解决方案1】:

欺负你通过一些教程工作。

假设您使用的是vivim 只需在[ .. ] 分组中包含一个制表符只需键入制表键强>。 (我一直使用腻子,如果按制表符没有将制表符“插入”到文档/命令行中,那么您遇到了腻子配置问题)。

^I 来自 vi list 模式。 List 模式很方便查看换行符 (\n) 将显示为 reg-exp char $ (在 reg-ex 中是“行尾锚”,另一个是 @ 987654328@char(行首))。

所以打开vi列表模式,使用:li,你会看到所有标签字符都扩展为^I,所有行尾都扩展为$

如你所说

如何让脚本删除嵌套括号中的空格,如图所示

这有点模棱两可,因为较新的 sed 使用普通括号作为分组字符来创建替换组,例如 \1 用于 s/pat/repl/ 替换 cmd 的替换端。

鉴于您的示例在替换端没有编号替换值,我假设目的是删除文字 () 对并且它应该按指示工作。一旦你:set list,在[ ... ] 中添加一个tab-char,它应该可以工作。如果没有,请使用可能出现的任何错误消息来编辑您的问题。

我希望这会有所帮助。

【讨论】:

  • 非常感谢您的 ^I 提示。我在 char 类中添加了制表符 char,在正则表达式中转义了括号 [( & )] 并再次尝试。现在我没有得到提示。它似乎陷入了无限循环。
  • 正如其他人所指出的,( test ) 不可能与 s/([ ]*)// 或任何带有作为模式一部分的右括号的东西匹配。你在下面写道“为什么([ ]*) 会导致无限循环”。尝试将 reg exp 更改为 ([ ][ ]*)([[:blank:]][:blank]])。回想一下,regexp * 的工作方式与通配符 char '' 不同,Regex * 表示前面的正则表达式(char、char-class 或 paren 括起来的组)的零个或多个。首先,正则表达式匹配 '(' 空格',然后它只匹配 '(',因为空格* 表示零个或多个空格(如方括号中定义的那样)。
  • 您需要重新阅读有关 sed 的 grymoires 基础知识,reg exp 有其不明显的方面,通过此类问题突出显示为一个问题并帮助您学会区分。继续测试,祝你好运。
【解决方案2】:

( test ) 与正则表达式 ([ ]*) 不匹配。 ([ ]*) 只匹配括号内只包含空格的字符串。也许您正在寻找 ([ ]* 来删除内部的前导空格和 [ ]*) 来删除尾随空格。

【讨论】:

  • 好收获。我也尝试从空括号中删除空间,但我没有得到提示(无限循环?)。
  • 如果你使用s/([ ]*//,你不应该得到一个循环,但如果你使用s/([ ]*/(/,你会。你应该使用s/([ ][ ]*/(/ 或者s/([ ]+/(/(如果你的sed支持+)
  • 谢谢。你能解释一下为什么 ([ ]*) 会导致无限循环吗?
  • 因为字符串() 与正则表达式([ ]*) 匹配,所以如果您将([ ]*) 替换为(),那么您将不断地用自身替换() 的实例。
  • 再次感谢您的解释。
猜你喜欢
  • 2015-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多