【问题标题】:remove all the white spaces up to the next non-white space starting at nth column using sed使用 sed 从第 n 列开始删除所有空格直到下一个非空格
【发布时间】:2014-09-27 02:28:36
【问题描述】:

我正在尝试使用 sed/awk/等。在 Cygwin 上删除从指定位置开始到下一个非空白字符的简单文本文件中所有行上的所有空格,保留指定位置之前和下一个非空白字符之后的所有空格.

我已经使用了足够多的 sed,知道它是可行的,但我自己无法弄清楚或找到正确的解决方案。我的问题似乎比我发现的大多数示例都简单,但我花了足够多的时间终于愿意承认我需要一些指导。

以下之前和之后的内容有望帮助解释我正在尝试做的事情。在这种情况下,我想从“L”列开始执行操作。

BEFORE:    
The quick brown fox     jumped high.
Mary had a little   lamb and ate it
Tom, Dick and Harry   feel   lost.

123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ

AFTER:    
The quick brown fox jumped high.
Mary had a little   lamb and ate it
Tom, Dick and Harry feel   lost.

任何建议将不胜感激。

【问题讨论】:

  • 输出必须是什么:Tom, Brian and Harry feel lost.
  • 如果你想要一个 sed 解决方案,为什么要用 awk 标记它?如果您对其他解决方案感到满意,为什么要在主题中说您想要一个 sed 解决方案?编辑您的问题主题和/或标签以阐明您真正想要的内容。

标签: regex awk sed


【解决方案1】:

这是使用正则表达式在 sed 中实现范围量词 { n } 的解决方案。

#!/bin/sh
STRING=$(cat <<EOF
The quick brown fox     jumped high.
Mary had a little   lamb and ate it
Tom, Dick and Harry   feel   lost.
EOF
)
echo "$STRING" | sed -r 's/^(.{20}) */\1/g'

输出

The quick brown fox jumped high.
Mary had a little   lamb and ate it
Tom, Dick and Harry feel   lost.

【讨论】:

  • +1 很好,获得一个涉及计数的良好 sed 解决方案是不寻常的!
【解决方案2】:

如果原文保存在data.txt中:

sed -e 's/^\(.\{19\}\)[[:space:]]\+/\1 /' data.txt

从头开始,计数 19 个字符并将其组成一组(\(.\{19\}\) 用于反向引用 (\1)。然后匹配一个或多个空格 - [[:space:]]\+。将整个匹配替换为反向引用和单个空格。

【讨论】:

  • +1 很好,获得一个涉及计数的良好 sed 解决方案是不寻常的!
【解决方案3】:

据我了解,您希望删除以“L”列(第 20 列)开头的多余空格。假设您的输入位于名为 before 的文件中,请运行:

$ awk -v c=20 '{x=substr($0,c); gsub(/  */, " ", x); print substr($0,1,c-1) x}' before
The quick brown fox can't jump
Mary had a little   lamb and ate it
Tom, Dick and Harry feel lost.

一次执行一个awk 命令:

  • -v c=20

    这将创建一个带有起始列信息的变量c

  • x=substr($0,c)

    这将创建一个变量x,其中包含我们要更改的行部分的文本。

  • gsub(/ */, " ", x)

    这会将变量x中出现的多个空格替换为单个空格。

  • print substr($0,1,c-1) x}

    这会打印出未更改的行首,然后是我们的变量x,它删除了多余的空格。

另类解释

假设我们只想删除从“L”列开始的空格,同时在该点之后的单词后面留下无关的空格:

$ awk -v c=20 '{x=substr($0,c); sub(/^  */, " ", x); print substr($0,1,c-1) x}' before
The quick brown fox can't jump
Mary had a little   lamb and ate it
Tom, Dick and Harry feel   lost.

此版本与之前版本的明显区别在于,这在最后一行中留下了“feel”和“lost”之间的多余空格。

【讨论】:

  • awk 字段、数组和字符串都从索引 1 开始,而不是 0。substr($0,0,...) 只是“工作”,因为0 是无效索引,因此 awk 默认使用 1substr($0,-357,...) 会得到相同的结果。
【解决方案4】:

将 GNU awk 用于 gensub():

$ awk -v p=21 '{print substr($0,1,p-1) gensub(/^\s+/,"","",substr($0,p))}' file
The quick brown fox jumped high.
Mary had a little   lamb and ate it
Tom, Dick and Harry feel   lost.

【讨论】:

    猜你喜欢
    • 2012-02-09
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2013-08-04
    • 2015-02-10
    • 1970-01-01
    • 2013-10-02
    • 2023-03-19
    相关资源
    最近更新 更多