출력의 각 줄에서 모든 선행 및 후행 공백과 탭을 제거하고 싶습니다.
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
작업을 수행합니다.