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

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

다양한 공백으로 구분된 일부 열을 포함하는 일부 텍스트 파일이 있지만 대신 구분 기호로 하나의 탭이 필요합니다. Bash에서 할 수 있습니까?

답변1

시퀀스를 변환하려면하나 이상의 공간탭으로 이동하지만개별 공간을 그대로 두다:

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' {} \;

MacOS에서는 다음 형식을 사용합니다(또는 Linux에서 이스케이프를 피하려면 +).

sed -E 's/ + /\t/g'

위의 예에서 필요한 다른 옵션 등과 함께.

답변2

캐릭터에 탭이 여러 개 있는 경우 다음을 사용할 수도 있습니다 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 " "

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

답변3

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

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

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

답변4

only를 사용하는 가장 쉬운 대답 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

관련 정보