使用sed删除从第n列开始的所有空格,直到下一个非空白空格

时间:2014-09-27 02:28:36

标签: regex awk sed

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

我已经足够使用sed来了解它的可行性,但我还没有能够自己弄明白或找到正确的解决方案。我的问题似乎比我发现的大多数例子都简单,但是我已经花了足够的时间,我终于愿意承认我需要一些指导。

以下之前和之后将有助于解释我尝试做的事情。在这种情况下,我想从第34页开始执行操作。"。

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.

任何建议都将不胜感激。

4 个答案:

答案 0 :(得分:4)

以下是使用正则表达式在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 :(得分:1)

据我了解,您希望删除以“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.

此版本与之前版本之间的明显区别在于,这会在最后一行中留下“感觉”和“丢失”之间的无关空格。

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

将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.