1

我无法获得与 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
> '

提示不回来。

[/更新2]

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

4

2 回答 2

2

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

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

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

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

正如你所说

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

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

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

我希望这有帮助。

于 2012-11-26T14:53:49.530 回答
1

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

于 2012-11-26T15:15:48.600 回答