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     $

이제 키를 누르고 해당 공간으로 이동하여 delspace

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 및 기타 셸에서도 지원됨):

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

답변2

다음 명령을 사용하여 줄의 시작과 끝에서 공백을 제거합니다.
다른 추가 요구 사항이 있으면 알려주십시오.


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

관련 정보