【发布时间】:2013-04-17 00:44:30
【问题描述】:
我有一个文本文件,在某些行中,左起第一个空格是 2 个空格长,我希望它是 1 个空格长。这个在 bash 中的脚本是什么?
123 2 5//problem
1 2 5
1 2 5
1 32 5//problem
我想要什么
123 2 5
1 2 5
1 2 5
1 32 5
【问题讨论】:
标签: regex linux bash shell unix
我有一个文本文件,在某些行中,左起第一个空格是 2 个空格长,我希望它是 1 个空格长。这个在 bash 中的脚本是什么?
123 2 5//problem
1 2 5
1 2 5
1 32 5//problem
我想要什么
123 2 5
1 2 5
1 2 5
1 32 5
【问题讨论】:
标签: regex linux bash shell unix
tr方式:
cat test.txt | tr -s ' '
【讨论】:
cat-while 方法。
使用 sed:
sed 's/^\([^ ][^ ]*[ ]\)[ ]*/\1/' input
从左边开始
^
匹配并捕获非空格字符和空格
\([^ ][^ ]*[ ]\)
以及任意数量的附加空格:
[ ]* # remove the star if you only care about exactly 2 spaces
并将这些替换为捕获的部分:
\1
【讨论】:
sed -E 's/^([^ ]+ )[ ]+/\1/' input。请注意 -E 打开扩展正则表达式,这 (a) 添加了对 + 量词(以及其他功能)的支持,并且 (b) 无需转义括号。 (使用+ 作为最终空格的量词具有额外的优势,即只有 multi 空格序列触发匹配,而原始序列也由单个空格触发(在这种情况下执行的替换基本上是无操作的)。)
编辑:我意识到大卫的回答几乎是正确的。
你可以使用 sed。
cat x | sed -e 's/ \+/ /'
这会将第一次出现的一个或多个空格替换为一个空格。
但你也可以纯粹用 bash 来做:
cat x | while read a b ; do echo "$a" "$b" ; done
这会在第一个单词处拆分每一行,并回显第一个单词和该行的其余部分。结果是第一个单词和该行的其余部分之间只有一个空格。
【讨论】:
º 代替空格,因为 - 具有讽刺意味的是 - 显然如此在 cmets 中将多个空格折叠成一个):cat x | sed -E 's/^([0-9]+)ºº/\1º/'。请注意 -E 以打开扩展正则表达式,这 (a) 添加了对 + 量词(以及其他功能)的支持,并且 (b) 无需转义括号和 +。