如何删除前导和尾随空格?

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 1print 相同。它会打印每一行。 @kev :它不适用于带有 ksh 的 CentOS 6.5 上的 GNU Awk 3.1.7:echo "foo;bar ">tt && print "_$( awk -F";" -OFS";" '$2=$21' tt)_" 提供 _foo;bar _。我错过了什么 ?顺便说一句,你的设置是什么?【参考方案2】:

您的代码对我来说没问题。 除了spacetabulation 之外,您可能还有其他东西...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.3GNU 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* 零个或多个空格$ 字符串结尾

【讨论】:

以上是关于如何删除前导和尾随空格?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Java中仅删除字符串的尾随空格并保留前导空格?

如何删除 MySQL 字段中的前导和尾随空格?

如何取回使用 .trim 删除的所有原始前导和尾随空格? [复制]

XSLT 删除所有属性的前导和尾随空格

Javascript从多行字符串中删除前导和尾随空格

前导和尾随空格剪切 + 中间空格替换