我想从输出中的每一行中删除所有前导和尾随空格和制表符。
trim
有没有像我可以将输出传输到其中的简单工具?
示例文件:
test space at back
test space at front
TAB at end
TAB at front
sequence of some space in the middle
some empty lines with differing TABS and spaces:
test space at both ends
答案1
awk '{$1=$1;print}'
或更短:
awk '{$1=$1};1'
将修剪前导和尾随空格或制表符1 并且将制表符和空格序列压缩到一个空格中。
这是有效的,因为当你将某件事分配给任何人时 场地然后尝试访问整个记录( ,默认打印的$0
内容),需要通过将所有字段(,...,)与(默认情况下为空格)连接来重建该记录。print
awk
$1
$NF
OFS
要同时删除空行,请将其更改为awk 'NF{$1=$1;print}'
(其中NF
作为条件选择字段N
数F
非零的记录)。做不是按照有时建议的做法,因为这也会删除第一个字段是( , , ...)awk '$1=$1'
0
支持的任何表示的行awk
0
00
-0e+12
¹ 以及可能的其他空白字符,具体取决于区域设置和awk
实现
答案2
如果您使用 GNU ,该命令可以像这样压缩sed
:
$ sed 's/^[ \t]*//;s/[ \t]*$//' < file
例子
这是上面的命令的实际操作。
$ echo -e " \t blahblah \t " | sed 's/^[ \t]*//;s/[ \t]*$//'
blahblah
您可以使用它hexdump
来确认该sed
命令是否正确剥离所需的字符。
$ echo -e " \t blahblah \t " | sed 's/^[ \t]*//;s/[ \t]*$//' | hexdump -C
00000000 62 6c 61 68 62 6c 61 68 0a |blahblah.|
00000009
字符类
您还可以使用字符类名称,而不是像这样逐字列出集合[ \t]
:
$ sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//' < file
例子
$ echo -e " \t blahblah \t " | sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//'
大多数使用正则表达式 (regex) 的 GNU 工具都支持这些类(这里是基于 ASCII 的系统的典型 C 语言环境中的等效项(并且仅在那里))。
[[:alnum:]] - [A-Za-z0-9] Alphanumeric characters
[[:alpha:]] - [A-Za-z] Alphabetic characters
[[:blank:]] - [ \t] Space or tab characters only
[[:cntrl:]] - [\x00-\x1F\x7F] Control characters
[[:digit:]] - [0-9] Numeric characters
[[:graph:]] - [!-~] Printable and visible characters
[[:lower:]] - [a-z] Lower-case alphabetic characters
[[:print:]] - [ -~] Printable (non-Control) characters
[[:punct:]] - [!-/:-@[-`{-~] Punctuation characters
[[:space:]] - [ \t\v\f\n\r] All whitespace chars
[[:upper:]] - [A-Z] Upper-case alphabetic characters
[[:xdigit:]] - [0-9a-fA-F] Hexadecimal digit characters
使用这些而不是文字集总是看起来浪费空间,但如果您担心代码的可移植性,或者必须处理替代字符集(想想国际化的),那么您可能会想要使用类名反而。
参考
答案3
不带参数的 xargs 可以做到这一点。
例子:
trimmed_string=$(echo "no_trimmed_string" | xargs)
答案4
如果将行存储为变量,则可以使用 bash 来完成这项工作:
从字符串中删除前导空格:
shopt -s extglob
printf '%s\n' "${text##+([[:space:]])}"
从字符串中删除尾随空格:
shopt -s extglob
printf '%s\n' "${text%%+([[:space:]])}"
删除字符串中的所有空格:
printf '%s\n' "${text//[[:space:]]}"