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

时间:2012-02-07 11:54:49

标签: awk whitespace gsub removing-whitespace

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

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

我错过了什么?

更新1

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

更新2

我使用gsub (/'[[:cntrl:]]|[[:space:]]|\x20/,"")它有效。 两件奇怪的事情:

  1. 为什么不将\ x20视为控制角色?

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

4 个答案:

答案 0 :(得分:25)

这个命令对我有用:

$ awk '{$1=$1}1' file.txt

答案 1 :(得分:4)

你的代码对我来说没问题。
spacetabulation之外,您可能还有其他内容 hexdump -C可以帮助您检查错误:

awk '{gsub(/^[ \t]+|[ \t]+$/,""); print;}' in.txt | hexdump -C | less

UPDATE:

好的,你确定了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 =>然后它不会被删除。
但这不是你的问题,不是吗?

答案 2 :(得分:1)

您的文件可能包含Windows行结尾。这意味着它们以\r\n结束,因此匹配行末尾的一系列制表符和空格将无效 - awk尝试匹配之后的所有制表符和空格 \r。尝试在将文件发送到awk之前通过tr -d "\r"运行该文件。

答案 3 :(得分:0)

可以使用Perl:

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

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