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


27

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


すばらしい入力をありがとう、しかし、私は列の中にいくつかの単一のスペースがあるので、単一のスペースをタブで移動することを避けなければなりません。ごめんなさい、情報です。
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: `.'
アーロンフランケ

@AaronFranke:どんなコマンドを試しましたか?私の答えの例では、このエラーは発生しません。
追って通知があるまで一時停止します。

申し訳ありませんが、明確にすべきでした。find下部に1。
アーロンフランケ

@AaronFranke:GNU sedは、バックアップ拡張機能の前にスペースを入れることを好みません。回答を編集しました。報告いただきありがとうございます。
追って通知があるまで一時停止します。

6

あなたのキャラクターが複数のタブであれば、あなたも使用することができます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つになります。


これはOPが求めているものではありません。
ロンジョン

5

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

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

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

OPは、スペースの数は可変であると言ったので、この解決策が機能するとは思わない。
ミケル

@Mikel。おっとっと。それを指摘してくれてありがとう。投稿を編集して、可変スペースのマッチングを許可しました。
IvanGoneKrazy

ここで最も役立つ答え。
ルイスデスーサ

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」を1回以上検索し、「+」とバックスラッシュ「\」で正規表現として解釈することを意味します。
新しいパターンはタブ「\ t」であり、これは正規表現形式で記述され、「g」はすべての行に置換を「グローバルに」適用します。


1
こんにちは、スーパーユーザーへようこそ。時間をかけてソリューションを説明する必要があります。* nixシステム、sed、および正規表現に慣れていない人にとっては、これは奇妙なキャラクターの山のように見えます。
モグ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.