Linuxで空白をタブに置き換える


98

特定のテキストファイルでLinuxの空白をタブに置き換えるにはどうすればよいですか?

回答:


168

unexpand(1)プログラムを使用する


UNEXPAND(1)                      User Commands                     UNEXPAND(1)

NAME
       unexpand - convert spaces to tabs

SYNOPSIS
       unexpand [OPTION]... [FILE]...

DESCRIPTION
       Convert  blanks in each FILE to tabs, writing to standard output.  With
       no FILE, or when FILE is -, read standard input.

       Mandatory arguments to long options are  mandatory  for  short  options
       too.

       -a, --all
              convert all blanks, instead of just initial blanks

       --first-only
              convert only leading sequences of blanks (overrides -a)

       -t, --tabs=N
              have tabs N characters apart instead of 8 (enables -a)

       -t, --tabs=LIST
              use comma separated LIST of tab positions (enables -a)

       --help display this help and exit

       --version
              output version information and exit
. . .
STANDARDS
       The expand and unexpand utilities conform to IEEE Std 1003.1-2001
       (``POSIX.1'').

4
わあ、展開/展開解除の存在を知らなかった。私は反対のことを行うと、拡大しようとしたことで周りの混乱に持つのではなく、完璧でしたtrsed
イブラヒム

4
ちなみに、展開/展開は標準ユーティリティです。
kojiro 2013年

4
とてもクールなので、これらは標準です。UNIXの哲学が大好きです。でもそれができればいいのに。
Matthew Flaschen 2013年


13
ただ注意してください-unexpandは単一のスペースをタブに変換しません。すべての0x20文字の実行を盲目的に単一のタブに変換する必要がある場合は、別のツールが必要です。
スティーブS.

44

あなたはawkで試すことができると思います

awk -v OFS="\t" '$1=$1' file1

または優先する場合はSED

sed 's/[:blank:]+/,/g' thefile.txt > the_modified_copy.txt

またはtr

tr -s '\t' < thefile.txt | tr '\t' ' ' > the_modified_copy.txt

またはSam Bisbeeによって提案されたtrソリューションの簡易バージョン

tr ' ' \\t < someFile > someFile

4
sedの例では、効率/速度の理由から、ベストプラクティスでは、sedよりも単一の文字を置き換えるためにtrを使用することを指示しています。また、TRの例では、この方法は非常に簡単です:tr ' ' \\t < someFile > someFile
サム・ビスビー

2
もちろん、trはsedよりもパフォーマンスが優れていますが、Unixを愛する私が持っている主な理由は、何かを行う方法がたくさんあることです。この置換を何度も行う予定の場合は、パフォーマンスの高いソリューションを検索しますが、1回だけ行う場合は、快適に感じるコマンドを含むソリューションを検索します。
ジョナサン

2
引数。sedを機能させるには、試行錯誤が必要でした。なぜ私はこのようにプラス記号をエスケープしなければならなかったのか分かりません:ls -l | sed "s/ \+/ /g"
Jess

awk -v OFS="\t" '$1=$1' file1私はあなたが(例えば番号0のライン始まりを持っていることに気づいた場合0 1 2)、その行は結果から省略されます。
Nikola Novak 14年

@Jess「正しいデフォルト構文」の正規表現が見つかりました。デフォルトでは、sedは単一の(エスケープされていない)プラス記号を単純な文字として扱います。「?」などの他の一部の文字についても同じことが言えます。詳細については、gnu.org / software / sed / manual / html_node / …を参照してください。同様の構文の詳細はここにあります(これはsedではなくgrepのmanであることに注意してください):gnu.org/software/grep/manual/grep.html#Basic-vs-Extended
Victor Yarema、2016

11

Perlの使用:

perl -p -i -e 's/ /\t/g' file.txt

3
連続するスペースを単一のタブに置き換えることで同様の問題がありました。Perlは、正規表現に「+」を追加するだけで機能しました。
トッド

けれどもは、もちろん、私は反対のことをやってみたかった:変換タブを二つの空間に:perl -p -i -e 's/\t/ /g' *.java
TIMP

これを再帰的に実行できますか?
アーロン・フランケ

9

より良いtrコマンド:

tr [:blank:] \\t

これにより、たとえばunzip -lの出力がクリーンアップされます。、grepやcutなどでさらに処理するために、。

例えば、

unzip -l some-jars-and-textfiles.zip | tr [:blank:] \\t | cut -f 5 | grep jar

私は仕事にそれを得るために、引用符を使用する必要はありません:tr [:blank:] \\t
オメルアン

3

次のスクリプトをダウンロードして実行し、プレーンテキストファイルのソフトタブをハードタブに再帰的に変換します。

プレーンテキストファイルを含むフォルダー内からスクリプトを配置して実行します。

#!/bin/bash

find . -type f -and -not -path './.git/*' -exec grep -Iq . {} \; -and -print | while read -r file; do {
    echo "Converting... "$file"";
    data=$(unexpand --first-only -t 4 "$file");
    rm "$file";
    echo "$data" > "$file";
}; done;

2

現在のディレクトリにある各.jsファイルをタブに変換するコマンドの例(先頭のスペースのみが変換されます):

find . -name "*.js" -exec bash -c 'unexpand -t 4 --first-only "$0" > /tmp/totabbuff && mv /tmp/totabbuff "$0"' {} \;

Windows 7のcygwinでテスト済み
arkod

1

も使用できますastyle。私はそれが非常に便利であるとわかり、いくつかのオプションもあります:

Tab and Bracket Options:
   If  no  indentation  option is set, the default option of 4 spaces will be used. Equivalent to -s4 --indent=spaces=4.  If no brackets option is set, the
   brackets will not be changed.

   --indent=spaces, --indent=spaces=#, -s, -s#
          Indent using # spaces per indent. Between 1 to 20.  Not specifying # will result in a default of 4 spaces per indent.

   --indent=tab, --indent=tab=#, -t, -t#
          Indent using tab characters, assuming that each tab is # spaces long.  Between 1 and 20. Not specifying # will result in a default assumption  of
          4 spaces per tab.`

0

あなたは、タブとライン上のすべての連続したスペースを置き換えるについて話している場合tr -s '[:blank:]' '\t'

[root@sysresccd /run/archiso/img_dev]# sfdisk -l -q -o Device,Start /dev/sda
Device         Start
/dev/sda1       2048
/dev/sda2     411648
/dev/sda3    2508800
/dev/sda4   10639360
/dev/sda5   75307008
/dev/sda6   96278528
/dev/sda7  115809778
[root@sysresccd /run/archiso/img_dev]# sfdisk -l -q -o Device,Start /dev/sda | tr -s '[:blank:]' '\t'
Device  Start
/dev/sda1       2048
/dev/sda2       411648
/dev/sda3       2508800
/dev/sda4       10639360
/dev/sda5       75307008
/dev/sda6       96278528
/dev/sda7       115809778

あなたは、すべての空白(例えばスペース、タブ、改行など)を置き換えについて話している場合tr -s '[:space:]'

[root@sysresccd /run/archiso/img_dev]# sfdisk -l -q -o Device,Start /dev/sda | tr -s '[:space:]' '\t'
Device  Start   /dev/sda1       2048    /dev/sda2       411648  /dev/sda3       2508800 /dev/sda4       10639360        /dev/sda5       75307008        /dev/sda6     96278528        /dev/sda7       115809778  

タブで破損したファイルの修正について話している場合は、を使用expandunexpand、他の回答で述べたように。


0

sedの使用:

T=$(printf "\t")
sed "s/[[:blank:]]\+/$T/g"

または

sed "s/[[:space:]]\+/$T/g"

-1

これにより、連続するスペースが1つのスペースに置き換えられます(タブは除く)。

tr -s '[:blank:]'

これにより、連続するスペースがタブに置き換えられます。

tr -s '[:blank:]' '\t'

実際には、-cそれはスペースではない連続した文字を置き換えます。
wingedsubmariner 2017年

1
問題はタブについてですが、これは答えではありません。
Matthew Read
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.