我无法获得与下面分支的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]*
),但这也无效。
答案 0 :(得分:2)
欺负你通过一些教程工作。
假设您正在使用vi
或vim
,只需要在[ .. ]
分组中添加标签字符,就是输入标签键。 (我一直使用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中只包含空格的字符串。也许您正在寻找([ ]*
删除内部的前导空格和[ ]*)
以删除尾随空格。