web-dev-qa-db-ja.com

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

さまざまな数のスペースで区切られたいくつかの列を含むテキストファイルがありますが、代わりに1つのタブをセパレーターとして必要とします。バッシュで行うことは可能ですか?

29
user_unknown

複数のスペースのシーケンスをタブに変換しますが、個々のスペースはそのままにします

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

キャラクターが複数のタブである場合は、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つになります。

7
user597119

sedを使用して、いくつかのスペースをタブに置き換えることができます。

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

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

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
3
Mikel

Perl -p -i -e 's/\s+/\t/g' *.txt

2
RedGrittyBrick

次のSEDスクリプトを試してください。

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

ここで、<TAB>はTABキーを押しています。

2
mdpc

これは非常にシンプルなソリューションです。

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

sedは基本的にこの方法で機能します(sed 's/old_pattern/new_pattern/g')。この場合、古いパターンは「\ s +」で、スペース「s」を1回以上「+」で検索し、バックスラッシュ「\」で正規表現として解釈します。
新しいパターンは正規表現形式で記述されたタブ「\ t」で、「g」は「グローバル」にすべての行に置換を適用します。

0
Waleed Omer