複数のスペースを 1 つのタブに置き換える方法

複数のスペースを 1 つのタブに置き換える方法

さまざまな数のスペースで区切られた列を含むテキスト ファイルがいくつかありますが、区切り文字としてタブが 1 つ必要です。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 " "

すべての空白が 1 つになります。

答え3

sed複数のスペースをタブに置き換えるには、を使用します。

1 つ以上のスペースを 1 つのタブに置き換える例:

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

答え4

のみを使用した最も簡単な答えは次の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 -s ' ' '\t' <<EOF
a b   c
d   e    f
  g h i
EOF
a       b       c
d       e       f
        g       h       i

関連情報