sed命令 - 分支到标签

时间:2012-11-26 13:04:35

标签: unix sed aix

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

在此处引用代码:

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

此过滤器后,空格仍位于括号内。

[UPDATE] 这是我的输出:

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

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

[/ UPDATE]

[UPDATE2]

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

提示不回来。

[/ UPDATE2]

另外如何输入“^ I”字符?我认为它是水平标签,但我无法通过puTTY键入其他控制字符(例如,要获得“Enter”,我键入“Ctrl-V”后跟“Enter”键,但这不是为标签工作。我只尝试使用空格(使用正则表达式[ ]*而不是[ ^I]*),但这也无效。

2 个答案:

答案 0 :(得分:2)

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

假设您正在使用vivim ,只需要在[ .. ]分组中添加标签字符就是输入标签键。 (我一直使用putty,如果按tab键没有将tab键“插入”文档/命令行,那么你就会遇到putty配置问题。)

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

因此,使用vi开启:li列表模式,您会看到所有标签字符展开为^I,所有行结尾为$

正如你所说

  

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

这有点含糊不清,因为较新的seds使用普通的parens作为分组字符来为{/ 1}}创建替换组,用于s / pat / repl / substitute cmd的替换端。

鉴于您的示例在替换方中没有编号替换值,我将假设其目的是删除文本\1对并且它应该如所示那样工作。在()之后,在:set list中添加tab-char,它应该可以正常工作。如果没有,请使用可能出现的任何错误消息编辑您的问题。

我希望这会有所帮助。

答案 1 :(得分:1)

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

相关问题