如何在非空格文本开始之前删除前导空格 + 正则表达式 + sed +

4

如何在echo的输出中去除809前的空格?

这是我的示例:

$ echo '   809 23/Dec/2008:19:20'
   809 23/Dec/2008:19:20
^^^3 spaces here preceding the 809    

我可以使用sed命令删除3或4个空格:
        ...4 spaces here   
$ echo '    809 23/Dec/2008:19:20' | sed 's/^.\{3\,4\}//'
809 23/Dec/2008:19:20
0 spaces here preceding the 809    

但我希望我的sed命令可以在大于3的任何地方起作用。
        .....5 spaces here
$ echo '     809 23/Dec/2008:19:20' | sed 's/^.\{3\,4\}//'
 809 23/Dec/2008:19:20
^1 spaces here preceding the 809    

如何在sed中编写正则表达式以删除809之前的3个或更多空格?


1
如果你想要删除开头的三个或更多空格,请使用 sed 's/^[[:blank:]]\{3,\}//' - Wiktor Stribiżew
也许是 ^\s{3,} - Srdjan M.
你必须使用sed吗?xargs会自动剪切空格。 - Jason Hu
你为什么在正则表达式中使用 .?那会匹配任何字符,而不仅仅是空格。 - Barmar
4个回答

6
如果您想要删除开头的3个或更多空格,请使用以下代码:
sed 's/^[[:blank:]]\{3,\}//'

详细信息

  • ^ - 开头的输入
  • [[:blank:]]\{3,\} - 3个或更多连续出现的任何水平空格。

如果您需要在特定值(例如809)之前删除 3 个或更多空格,请将该值添加到正则表达式和替换模式中:

sed 's/^[[:blank:]]\{3,\}809/809/'

或者使用捕获组和占位符:
sed 's/^[[:blank:]]\{3,\}\(809\)/\1/'

enter image description here


3

xargs可以让您摆脱对正则表达式的烦恼。

$ echo '   809 23/Dec/2008:19:20' | xargs
809 23/Dec/2008:19:20

这是一个比较不寻常的技巧。该工具旨在用于构建具有长参数列表的命令。从手册中可以看到:

xargs从标准输入读取项目,由空格(可以用双引号或单引号或反斜杠进行保护)或换行符分隔,并执行命令

然而,在预处理的一部分中,将修剪空格,然后将其发送到后续命令。在这种情况下,没有后续命令,因此xargs会将参数按照原样发送到标准输出,除了修剪掉的空格,这正是您所要求的。

知道很好 echo ' 809 23/Dec/2008:19:20' | xargs 809 23/Dec/2008:19:20 你能简要解释一下 xargs 吗? - HattrickNZ
1
@HattrickNZ 我添加了更多的文字来解释为什么它会起作用。 - Jason Hu

1
您可以使用{minimum,maximum}指定要使用的字符数。如果将最大值留空,则将匹配至少具有最小字符数的任何内容。因此,选择三个空格将是“\ {3,\}”。祝你好运!

0

不要转义逗号:

$ echo '             809 23/Dec/2008:19:20' | sed -s 's/^ \{3,\}//'
809 23/Dec/2008:19:20

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接