我正在使用awk '{gsub(/^[ \t]+|[ \t]+$/,""); print;}' in.txt > out.txt
删除前导空格和尾随空格。
问题是输出文件实际上有尾随空格!所有线条长度相同 - 它们都用空格填充。
我错过了什么?
更新1
问题可能是由于尾随空格不是“普通”空格而是\ x20个字符(DC4)。
更新2
我使用gsub (/'[[:cntrl:]]|[[:space:]]|\x20/,"")
它有效。
两件奇怪的事情:
为什么不将\ x20视为控制角色?
使用'[[:cntrl:][:space:]\x20
不起作用。为什么呢?
答案 0 :(得分:25)
这个命令对我有用:
$ awk '{$1=$1}1' file.txt
答案 1 :(得分: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
=>然后它不会被删除。
但这不是你的问题,不是吗?
答案 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*
零个或多个空格
$
字符串结尾