14

awk '{gsub(/^[ \t]+|[ \t]+$/,""); print;}' in.txt > out.txt用来删除前导和尾随空格。

问题是输出文件实际上有尾随空格!所有行的长度相同 - 它们用空格填充。

我错过了什么?

更新 1

问题可能是由于尾随空格不是“正常”空格而是 \x20 字符(DC4)。

更新 2

我用gsub (/'[[:cntrl:]]|[[:space:]]|\x20/,"")了它的工作。两件奇怪的事:

  1. 为什么 \x20 不被视为控制字符?

  2. 使用'[[:cntrl:][:space:]\x20不起作用。为什么?

4

4 回答 4

26

这个命令对我有用:

$ awk '{$1=$1}1' file.txt
于 2012-02-07T14:17:32.700 回答
4

你的代码对我来说没问题。
您可能还有其他东西,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在文本中间有
=>,则它不会被删除。
但这不是你的问题,不是吗?

于 2012-02-07T12:09:54.567 回答
1

您的文件可能有 Windows 行结尾。这意味着它们以 . 结尾\r\n,因此在行尾匹配一系列制表符和空格将不起作用 - awk 尝试匹配.之后的所有制表符和空格\rtr -d "\r"在将文件发送到 awk 之前尝试运行该文件。

于 2012-02-07T12:14:50.187 回答
0

可以使用 Perl:

perl -lpe 's/^\s*(.*\S)\s*$/$1/' in.txt > out.txt

s/foo/bar/使用正则表达式替换
^字符串开头的
\s*零个或多个空格
(.*\S)以非空格结尾的任何字符。将其捕获到 $1
\s*零个或多个空格
$的字符串末尾

于 2015-10-06T23:57:03.690 回答