Regex 如果第一个空格是2个空格,则在文件中设为1

Regex 如果第一个空格是2个空格,则在文件中设为1,regex,linux,bash,shell,unix,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 使用sed: sed 's/^\([^ ][^ ]*[ ]\)[ ]*/\1/' input 从左边开始 ^ 匹配并捕获非空格字符和空格 \([^ ][^ ]*[ ]\) 以及任意数量的附加空间: [ ]*

我有一个文本文件,在一些行中,左边的第一个空格是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
使用sed:

sed 's/^\([^ ][^ ]*[ ]\)[ ]*/\1/' input
从左边开始

^ 
匹配并捕获非空格字符和空格

\([^ ][^ ]*[ ]\)
以及任意数量的附加空间:

[ ]*   # remove the star if you only care about exactly 2 spaces 
并用捕获的零件替换这些零件:

 \1
编辑:我意识到大卫的回答几乎是对的

您可以使用sed

cat x | sed -e 's/ \+/ /'
这将用单个空间替换第一次出现的一个或多个空间

但是,您也可以在bash中完全执行此操作:

cat x | while read a b ; do echo "$a" "$b" ; done
这将在第一个单词处拆分每行,并回显第一个单词和该行的其余部分。结果是,第一个单词和行的其余部分之间只有一个空格。

tr
方式:

cat test.txt | tr -s ' '

第一个将查找长度为2的第一个空格,还是仅从左侧查看第一个空格,如果其长度为2,则对其进行更改?OSX用户注意(至少从10.8开始):作为一个更简单的选择,您可以使用以下命令:
sed-E的s/^([^]+)[+/\1/'input
。注意
-E
打开扩展正则表达式,这(a)增加了对
+
量词的支持(以及其他功能)和(b)不需要转义括号。(使用
+
作为最终空格的量词具有额外的优势,即只有多个空格序列触发匹配,而原始空格也由单个空格触发(在这种情况下,执行的替换基本上是无操作)只是想澄清一下:这将把两个或多个空格的所有跨度都折叠成一个空格。@mklement:对,这并不能解决所问的问题。是的,我现在明白了。我没有意识到我们仍然需要在#2和#3列之间保留两个空格。如果是这样的话,我会使用另一个答案的
cat-while
方法。OSX用户注意(至少从10.8开始):使用下面的sed命令代替(注意:不得不使用
º
代替空格,因为讽刺的是,在注释中将多个空格折叠成一个):
cat X|sed-E的s/^([0-9]+):/º/\1º/'
。请注意
-E
打开扩展正则表达式,它(a)增加了对
+
量词的支持(以及其他功能)和(b)不需要转义括号和
+