sed 从行尾删除空格(多重编码)

sed 从行尾删除空格(多重编码)

我喜欢删除空间从行的开头和结尾。

result="$(mysql -r --column-names=0 -e "SELECT String FROM Table")"
echo $result | cat -E
+stringA +StringB     $
echo $result | sed 's/^\([[:blank:]]\)\+//g' | sed 's/\([[:blank:]]\)\+$//g' | cat -E
+stringA +StringB     $

我用鼠标复制了字符串,然后用鼠标键3(按下滚轮)

echo '+stringA +StringB     ' | sed 's/^\([[:blank:]]\)\+//g' | sed 's/\([[:blank:]]\)\+$//g' | cat -E
+stringA +StringB     $

现在我按下了键,导航到空格并将其替换为deland space

echo '+stringA +StringB     ' | sed 's/^\([[:blank:]]\)\+//g' | sed 's/\([[:blank:]]\)\+$//g' | cat -E
+stringA +StringB$

现在sed命令匹配并删除了空间. 我如何转换错误的空格 不间断空格正常空间

echo $LANG
en_US.UTF-8
$bash --version
GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu)
mysql -e "SHOW VARIABLES LIKE '%char%'"
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

更新1:

echo '+stringA +stringB         ' | od -tx1z
0000000 2b 73 74 72 69 6e 67 41 20 2b 73 74 72 69 6e 67  >+stringA +string<
0000020 42 c2 a0 c2 a0 c2 a0 c2 a0 c2 a0 c2 a0 c2 a0 c2  >B...............<
0000040 a0 c2 a0 0a                                      >....<
0000044
echo '+stringA +stringB         ' | od -tx1z
0000000 2b 73 74 72 69 6e 67 41 20 2b 73 74 72 69 6e 67  >+stringA +string<
0000020 42 20 20 20 20 20 20 20 20 20 0a                 >B         .<
0000033
echo '+stringA +stringB         ' | od -c
0000000   +   s   t   r   i   n   g   A       +   s   t   r   i   n   g
0000020   B 302 240 302 240 302 240 302 240 302 240 302 240 302 240 302
0000040 240 302 240  \n
0000044
echo '+stringA +stringB         ' | od -c
0000000   +   s   t   r   i   n   g   A       +   s   t   r   i   n   g
0000020   B                                      \n
0000033

-命令echo1 和 3 使用鼠标键 3 复制echo-命令 2 和 4 使用鼠标键复制普通的空间

更新2:

我插入了sed命令,[^[:graph:]]但它没有改变输出。

for UKWID in 123 456 678; do
    result="$(mysql -r --column-names=0 -e "SELECT String FROM Table WHERE id = $UKWID")"
    echo "$result" | sed 's/^[^[:graph:]]*//;s/[^[:graph:]]*//' | cat -E
done
+stringA +stringB         $
   +stringc +stringx    $
+stringe +stringf      $

答案1

有些空格(如 U+00A0 不间断空格)或不可见字符(如退格键或 U+200B)未分类为某些区域设置[:blank:],甚至[:space:]在某些区域设置中也未分类。

理论上,您应该能够使用以下方法修剪所有非图形字符:

sed 's/^[^[:graph:]]*//;s/[^[:graph:]]*$//'

但在某些系统的某些区域设置上,U+00A0 不起作用。

perl -Mopen=locale -lpe 's/^\P{Graph}+|\P{Graph}+$//'

适用于您的 U+00A0,但不适用于 U+200B

您也可以自己单独添加这些字符。使用类似 zsh 的$'\u....'扩展(最近版本的 bash 和其他一些 shell 也支持):

trim=$'[[:space:][:cntrl:]\u00a0\u200b]*'
sed "s/^$trim//;s/$trim\$//"

答案2

使用以下命令删除行首和行尾的空格
命令让我知道是否有任何其他附加要求


 sed -r "s/^\s+//g"| sed -r "s/\s+$//g"

相关内容