从字符串中删除前导空格:

从字符串中删除前导空格:

我想从输出中的每一行中删除所有前导和尾随空格和制表符。

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内容),需要通过将所有字段(,...,)与(默认情况下为空格)连接来重建该记录。printawk$1$NFOFS

要同时删除空行,请将其更改为awk 'NF{$1=$1;print}'(其中NF作为条件选择字段NF非零的记录)。做不是按照有时建议的做法awk '$1=$1',因为这也会删除第一个字段是( , , ...)0支持的任何表示的行awk000-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:]]}"

相关内容