【问题标题】:if first space is 2 space, make it 1 in a file如果第一个空格是 2 个空格,则在文件中将其设为 1
【发布时间】: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


    【解决方案1】:

    tr方式:

    cat test.txt | tr -s ' '
    

    【讨论】:

    • 澄清一下:这会将两个或多个空格的所有跨度折叠成一个空格。
    • @mklement:是的,这并不能解决所提出的问题。
    • 是的,我现在明白了。我没有意识到我们仍然需要在 #2 和 #3 列之间保留两个空格。如果是这种情况,我会从另一个答案中使用cat-while 方法。
    【解决方案2】:

    使用 sed:

    sed 's/^\([^ ][^ ]*[ ]\)[ ]*/\1/' input
    

    从左边开始

    ^ 
    

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

    \([^ ][^ ]*[ ]\)
    

    以及任意数量的附加空格:

    [ ]*   # remove the star if you only care about exactly 2 spaces 
    

    并将这些替换为捕获的部分:

     \1
    

    【讨论】:

    • 第一个会寻找长度为 2 的第一个空格,还是只看左边的第一个空格,如果它的长度为 2,则更改它?
    • OS X 用户注意事项(至少从 10.8 开始):作为更简单的替代方法,您可以使用以下命令:sed -E 's/^([^ ]+ )[ ]+/\1/' input。请注意 -E 打开扩展正则表达式,这 (a) 添加了对 + 量词(以及其他功能)的支持,并且 (b) 无需转义括号。 (使用+ 作为最终空格的量词具有额外的优势,即只有 multi 空格序列触发匹配,而原始序列也由单个空格触发(在这种情况下执行的替换基本上是无操作的)。)
    【解决方案3】:

    编辑:我意识到大卫的回答几乎是正确的。

    你可以使用 sed。

    cat x | sed -e 's/ \+/ /'
    

    这会将第一次出现的一个或多个空格替换为一个空格。

    但你也可以纯粹用 bash 来做:

    cat x | while read a b ; do echo "$a" "$b" ; done
    

    这会在第一个单词处拆分每一行,并回显第一个单词和该行的其余部分。结果是第一个单词和该行的其余部分之间只有一个空格。

    【讨论】:

    • OS X 用户注意事项(至少从 10.8 开始):请改用以下 sed 命令(注意:必须使用 º 代替空格,因为 - 具有讽刺意味的是 - 显然如此在 cmets 中将多个空格折叠成一个):cat x | sed -E 's/^([0-9]+)ºº/\1º/'。请注意 -E 以打开扩展正则表达式,这 (a) 添加了对 + 量词(以及其他功能)的支持,并且 (b) 无需转义括号和 +
    猜你喜欢
    • 1970-01-01
    • 2014-06-03
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多