如何删除前导和尾随空格?
Posted
技术标签:
【中文标题】如何删除前导和尾随空格?【英文标题】:How to remove leading and trailing whitespaces? 【发布时间】:2012-02-28 20:29:53 【问题描述】:我正在使用 awk 'gsub(/^[ \t]+|[ \t]+$/,""); print;' in.txt > out.txt
删除前导和尾随空格。
问题是输出文件实际上有尾随空格!所有行的长度相同 - 它们都用空格填充。
我错过了什么?
更新 1
问题可能是由于尾随空格不是“正常”空格而是 \x20 个字符 (DC4)。
更新 2
我使用了gsub (/'[[:cntrl:]]|[[:space:]]|\x20/,"")
,它成功了。
两件奇怪的事:
为什么不将 \x20 视为控制字符?
使用'[[:cntrl:][:space:]\x20
不起作用。为什么?
【问题讨论】:
更新:也许这些不是简单的空格,而是 DC4 控制字符?这些文件来自 Windows。\x20
是一个常规的 ASCII 空间。控制字符是\x00
到\x1F
。
【参考方案1】:
这个命令对我有用:
$ awk '$1=$11' file.txt
【讨论】:
+1 是的,为什么不呢? ;-) 你甚至可以这样做:awk '$1=$1' file.txt
不是吗?
@eddi。 awk
将通过删除多余的空格来规范化一行。 $1=$1
触发动作,否则什么都不会发生。
我认为您应该将其添加到答案中,并解释 1 的作用。
@eddi 1
与 print
相同。它会打印每一行。
@kev :它不适用于带有 ksh 的 CentOS 6.5 上的 GNU Awk 3.1.7:echo "foo;bar ">tt && print "_$( awk -F";" -OFS";" '$2=$21' tt)_"
提供 _foo;bar _
。我错过了什么 ?顺便说一句,你的设置是什么?【参考方案2】:
您的代码对我来说没问题。
除了space
和tabulation
之外,您可能还有其他东西...hexdump -C
可能会帮助您检查问题所在:
awk 'gsub(/^[ \t]+|[ \t]+$/,""); print;' in.txt | hexdump -C | less
更新:
好的,您确定了 DC4(可能还有其他一些控制字符...) 然后,您可以改进您的命令:
awk 'gsub(/^[[:cntrl:][:space:]]+|[[:cntrl:][:space:]]+$/,""); print;' in.txt > out.txt
参见awk
联机帮助页:
[:alnum:] Alphanumeric characters.
[:alpha:] Alphabetic characters.
[:blank:] Space or tab characters.
[:cntrl:] Control characters.
[:digit:] Numeric characters.
[:graph:] Characters that are both printable and visible. (A space is printable, but not visible, while an a is both.)
[:lower:] Lower-case alphabetic characters.
[:print:] Printable characters (characters that are not control characters.)
[:punct:] Punctuation characters (characters that are not letter, digits, control characters, or space characters).
[:space:] Space characters (such as space, tab, and formfeed, to name a few).
[:upper:] Upper-case alphabetic characters.
[:xdigit:] Characters that are hexadecimal digits.
前导/尾随 0x20
移除
对我来说命令没问题,我已经这样测试了:
$ echo -e "\x20 \tTEXT\x20 \t" | hexdump -C
00000000 20 20 09 54 45 58 54 20 20 09 0a | .TEXT ..|
0000000b
$ echo -e "\x20 \tTEXT\x20 \t" | awk 'gsub(/^[[:cntrl:][:space:]]+|[[:cntrl:][:space:]]+$/,""); print;' | hexdump -C
00000000 54 45 58 54 0a |TEXT.|
00000005
但是,如果您的文字中间有0x20
=> 那么它不会被删除。
但这不是你的问题,不是吗?
【讨论】:
我真的认为这会起作用,但它没有,我仍然留下所有这些“空格”ASCII码20(int = 32)。 你好@user1194552。请在awk
处理前后提供您的hexdump -C
输出。这样我才能更好地理解你的问题。因为当我尝试测试时,它对我来说看起来不错:-)
你的awk --version
是什么?我可以测试两个版本:GNU Awk 3.1.3
和 GNU Awk 3.1.5
。请提供您的hexdump -C
。然后我可以测试和你一样的东西。【参考方案3】:
您的文件可能有 Windows 行结尾。这意味着它们以\r\n
结尾,因此在行尾匹配一系列制表符和空格是行不通的——awk 会尝试匹配出现在之后的所有制表符和空格\r
。在将文件发送到 awk 之前,尝试通过 tr -d "\r"
运行文件。
【讨论】:
【参考方案4】:可以使用 Perl:
perl -lpe 's/^\s*(.*\S)\s*$/$1/' in.txt > out.txt
s/foo/bar/
使用正则表达式替换^
字符串开头\s*
零个或多个空格(.*\S)
任何以非空格结尾的字符。将其捕获到 $1\s*
零个或多个空格$
字符串结尾
【讨论】:
以上是关于如何删除前导和尾随空格?的主要内容,如果未能解决你的问题,请参考以下文章