하나의 탭으로 여러 공백을 바꾸는 방법


27

여러 개의 공백으로 구분 된 일부 열이 포함 된 일부 텍스트 파일이 있지만 대신 구분 기호로 하나의 단일 탭이 필요합니다. 배쉬에서 할 수 있습니까?


큰 입력에 감사하지만 열 안에 하나의 공백이 있으므로 단일 공백을 탭하지 않아야합니다. 죄송합니다, 정보.
user_unknown

답변:


31

둘 이상의 공백 시퀀스를 탭으로 변환하지만 개별 공백은 그대로 둡니다 .

sed 's/ \+ /\t/g' inputfile > outputfile

여러 파일에 대해이를 수행하려면 다음을 수행하십시오.

for inputfile in *
do
    sed 's/ \+ /\t/g' "$inputfile" > tmpfile && mv tmpfile "$inputfile"
done

또는

for inputfile in *
do
    sed -i.bak 's/ \+ /\t/g' "$inputfile"
done

또는

find . -type f -exec sed -i.bak 's/ \+ /\t/g' {} \;

sed: -e expression #1, char 1: unknown command: `.'
Aaron Franke

@AaronFranke : 어떤 명령을 시도 했습니까? 내 대답의 예 중 어느 것도 그 오류를 일으키지 않아야합니다.
추후 공지가있을 때까지 일시 중지되었습니다.

죄송합니다. 명확히해야합니다. find바닥에 하나.
Aaron Franke

@AaronFranke : GNU sed는 백업 확장 앞에 공백이없는 것을 좋아합니다. 내 답변을 편집했습니다. 보고서 주셔서 감사합니다.
추후 공지가있을 때까지 일시 중지되었습니다.

7

캐릭터가 여러 탭인 경우 다음을 사용할 수도 있습니다 tr -s.

-s, --squeeze-repeats   replace each input sequence of a repeated character
                        that is listed in SET1 with a single occurrence

예를 들면 다음과 같습니다.

my_file.txt | tr -s " "

모든 공백은 하나가됩니다.


이것은 OP가 요구하는 것이 아닙니다.
RonJohn

5

sed여러 공백을 탭으로 바꾸는 데 사용할 수 있습니다 .

하나 이상의 공백을 하나의 탭으로 바꾸는 예 :

cat spaced-file | sed 's/ \+/\t/g' > tabbed-file

OP는 공간의 수가 가변적 이라고 말했기 때문에이 솔루션이 효과가 있다고 생각하지 않습니다.
Mikel

@ 미켈. 죄송합니다. 지적 해 주셔서 감사합니다. 가변 공간과 일치하도록 게시물을 편집했습니다.
IvanGoneKrazy

가장 유용한 답변은 여기입니다.
Luís de Sousa

3

가장 쉬운 대답 bash은 다음과 같습니다.

while read -r col1 col2 col3 ...; do
    echo -e "$col1\t$col2\t$col3..."
done <file

가변 개수의 열이있는 경우이 작업을 수행 할 수 있지만 다음에서만 작동 bash하지는 않습니다 sh.

while read -r -a cols; do
    (
        IFS=$'\t'
        echo "${cols[*]}"
    )
done <file

예 :

while read -r -a cols; do
    (
        IFS=$'\t'
        echo "${cols[*]}"
    )
done <<EOF
a b   c
d   e    f
  g h i
EOF

생산 :

a   b   c
d   e   f
g   h   i

(각 탭 사이에 탭이 있지만 여기에 붙여 넣을 때보기가 어렵습니다)

또한 사용하여 그것을 할 수 sed또는 tr하지만, 통지는 시작에 공백의 처리는 다른 결과를 얻을 수있다.

sed :

$ sed 's/  */\t/g' << EOF
a b   c
d   e    f
  g h i
EOF
a       b       c
d       e       f
        g       h       i

tr :

$ tr -s ' ' '\t' <<EOF
a b   c
d   e    f
  g h i
EOF
a       b       c
d       e       f
        g       h       i


2

다음 SED 스크립트를 사용해보십시오.

 sed 's/  */<TAB>/g' <spaces-file > tabs-file

<TAB>은 Tab 키를 누릅니다.


0

이것은 매우 간단한 해결책입니다.

    sed -E 's/\s+/\t/g' your_file > new_file

sed는 기본적으로 이런 방식으로 작동합니다 (sed 's / old_pattern / new_pattern / g'). 이 경우 이전 패턴은 "\ s +"이며 이는 "s"공간을 한 번 이상 "+"찾아서 백 슬래시 "\"를 찾아 정규 표현식으로 해석하는 것을 의미합니다.
새 패턴은 "\ t"탭으로 정규식 형식으로 작성되며 "g"는 모든 행에 "전역 적으로"적용됩니다.


1
안녕하세요, 수퍼 유저입니다. 시간을내어 솔루션을 설명해야합니다. * nix 시스템, sed 및 정규식에 익숙하지 않은 사람에게는 이상한 문자 더미처럼 보입니다.
Mogget
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.