[unix] 일부 출력의 각 줄에서 선행 및 후행 공백을 자르려면 어떻게합니까?

출력의 각 줄에서 모든 선행 및 후행 공백과 탭을 제거하고 싶습니다.

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 



답변

awk '{$1=$1;print}'

또는 더 짧은 :

awk '{$1=$1};1'

선행 및 후행 공백이나 탭 문자 트림겠습니까 1 하나의 공간으로 탭과 공간의 시퀀스를 짠다.

당신이 중 하나에 뭔가를 할당 할 때 때문 작동 필드 , awk(인쇄로 전체 기록을 재 구축 print) (모든 필드에 가입하여 $1, …, $NF로) OFS(기본적으로 공간).

1 (및 로캘 및 awk구현 에 따라 다른 빈 문자 )


답변

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 도구는 이러한 클래스를 지원합니다.

 [[:alnum:]]  - [A-Za-z0-9]     Alphanumeric characters
 [[:alpha:]]  - [A-Za-z]        Alphabetic characters
 [[:blank:]]  - [ \x09]         Space or tab characters only
 [[:cntrl:]]  - [\x00-\x19\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]       All whitespace chars
 [[:upper:]]  - [A-Z]           Upper-case alphabetic characters
 [[:xdigit:]] - [0-9a-fA-F]     Hexadecimal digit characters

리터럴 세트 대신 이것들을 사용하는 것은 항상 공간 낭비처럼 보이지만, 코드가 이식 가능하거나 대체 문자 세트를 다루어야하는 경우 (국제 생각), 클래스 이름을 사용하고 싶을 것입니다 대신에.

참고 문헌


답변

허용 된 답변에서 Stéphane Chazelas 가 제안한대로 이제
스크립트를 작성할 수 있습니다 /usr/local/bin/trim.

#!/bin/bash
awk '{$1=$1};1'

해당 파일 실행 권한을 부여하십시오.

chmod +x /usr/local/bin/trim

이제 모든 출력을 trim예를 들어 다음과 같이 전달할 수 있습니다 .

cat file | trim

(아래 의견 : 나는 이것을 전에 사용했다 : while read i; do echo "$i"; done
그것은 잘 작동하지만 성능이 떨어짐)


답변

인수없이 xargs가 그렇게합니다.

예:

trimmed_string=$(echo "no_trimmed_string" | xargs) 


답변

sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'

쉘 변수에 줄을 읽고 있다면 달리 지시하지 않는 한read 이미 수행합니다 .


답변

행을 변수로 저장하면 bash를 사용하여 작업을 수행 할 수 있습니다.

문자열에서 선행 공백을 제거하십시오.

shopt -s extglob
echo ${text##+([[:space:]])}

문자열에서 후행 공백을 제거하십시오.

shopt -s extglob
echo ${text%%+([[:space:]])}

문자열에서 모든 공백을 제거하십시오.

echo ${text//[[:space:]]}


답변

‘piped’도구 덕분에 주어진 행에서 모든 선행 및 후행 공백을 제거하기 위해 완전히 다른 3 가지 방법을 식별 할 수 있습니다. 이러한 차이점은 입력 줄의 단어 사이의 공백과 관련이 있습니다. 예상되는 동작에 따라 선택해야합니다.

차이점을 설명하려면 다음 더미 입력 라인을 고려하십시오.

"   \t  A   \tB\tC   \t  "

tr

$ echo -e "   \t  A   \tB\tC   \t  " | tr -d "[:blank:]"
ABC

tr정말 간단한 명령입니다. 이 경우 공백 또는 표 문자를 삭제합니다.

어 wk

$ echo -e "   \t  A   \tB\tC   \t  " | awk '{$1=$1};1'
A B C

awk 선행 및 후미 공백을 삭제하고 단어 사이의 모든 공백을 단일 공백으로 압축합니다.

sed

$ echo -e "   \t  A   \tB\tC   \t  " | sed 's/^[ \t]*//;s/[ \t]*$//'
A       B   C

이 경우 sed단어 사이의 공백을 건드리지 않고 선행 및 후행 공백을 삭제합니다.

말:

한 줄에 하나의 단어가 있으면 tr작업을 수행합니다.