Beyaz boşlukları linux'ta sekmelerle değiştirin


100

Belirli bir metin dosyasında beyaz boşlukları linux'ta sekmelerle nasıl değiştiririm?

Yanıtlar:


169

Genişlemeyen (1) programını kullanın


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
Woah, genişlemenin / açılmamanın var olduğunu asla bilmiyordum. Tam tersini yapmaya çalışıyordum ve trveya ile uğraşmak yerine genişlemek mükemmeldi sed.
İbrahim

4
Kayıt için, genişlet / genişlet standart yardımcı programlardır .
kojiro

4
O kadar harika ki bunlar standart. UNIX felsefesini seviyorum . Yine de yerinde yapabilseydi iyi olurdu.
Matthew Flaschen


13
Sadece bir uyarı - genişletme, tek bir alanı sekmeye dönüştürmez. Tüm 0x20 karakterlerini körü körüne tek bir sekmeye dönüştürmeniz gerekiyorsa, farklı bir araca ihtiyacınız vardır.
Steve S.

44

Bence awk ile deneyebilirsin

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

veya tercih ederseniz SED

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

hatta tr

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

veya Sam Bisbee tarafından önerilen tr çözümünün basitleştirilmiş bir versiyonu

tr ' ' \\t < someFile > someFile

4
Sed örneğinizde, en iyi uygulamalar verimlilik / hız nedenlerinden ötürü sed yerine tek karakterleri değiştirmek için tr kullanmanızı dikte eder. Ayrıca, tr örneği bu şekilde çok daha kolaydır:tr ' ' \\t < someFile > someFile
Sam Bisbee

2
Elbette tr'nin sed'den daha iyi bir performansı var, ancak Unix'i sevmemin ana sebebi, bir şeyler yapmanın birçok yolu olması. Bu ikameyi birçok kez yapmayı planlıyorsanız, iyi performans gösteren bir çözüm arayacaksınız, ancak bunu yalnızca bir kez yapacaksanız, kendinizi rahat hissettirecek bir komut içeren bir çözüm arayacaksınız.
Jonathan

2
arg. Sed'i çalıştırmak için deneme yanılma kullanmak zorunda kaldım. Artı işaretinden neden böyle kaçmak zorunda kaldığımı bilmiyorum:ls -l | sed "s/ \+/ /g"
Jess

İle awk -v OFS="\t" '$1=$1' file10 0 1 2rakamıyla başlayan bir satırınız varsa (örneğin ), satırın sonuçtan çıkarılacağını fark ettim .
Nikola Novak

@Jess "Doğru varsayılan sözdizimi" normal ifadesini buldunuz. Sed varsayılan olarak tekli (çıkış karaktersiz) artı işaretini basit karakter olarak ele alır. Aynı şey '?' Gibi diğer karakterler için de geçerlidir ... Daha fazla bilgiyi burada bulabilirsiniz: gnu.org/software/sed/manual/html_node/… . Benzer sözdizimi ayrıntıları burada bulunabilir (bunun grep için man olduğunu unutmayın, sed değil): gnu.org/software/grep/manual/grep.html#Basic-vs-Extended .
Victor Yarema

13

Perl Kullanımı :

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

3
Ardışık boşlukları tek bir sekmeyle değiştirme konusunda benzer bir sorun vardı. Perl, regexp'e yalnızca '+' ekleyerek çalıştı.
Todd

Yine de, elbette bunun tersini yapmak istedim: sekmeleri iki boşluğa perl -p -i -e 's/\t/ /g' *.java
çevirin

Bunu yinelemeli olarak yapabilir miyim?
Aaron Franke

Bu benim için çalışan tek varyanttı; Kullandığım s/ {4}/sekmelere girinti 4-boşluk dönüştürmek.
CrazyPyro

10

daha iyi tr komutu:

tr [:blank:] \\t

Bu, grep, cut vb. İle daha fazla işlem yapmak için , örneğin unzip -l çıktısını temizleyecektir .

Örneğin,

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

Çalışması için alıntı kullanmak zorunda değilim:tr [:blank:] \\t
Ömer An

3

Yumuşak sekmeleri düz metin dosyalarında tekrar tekrar sabit sekmelere dönüştürmek için aşağıdaki komut dosyasını indirin ve çalıştırın.

Komut dosyasını, düz metin dosyalarını içeren klasörün içinden yerleştirin ve çalıştırın.

#!/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

Geçerli dizin altındaki her .js dosyasını sekmelere dönüştürmek için örnek komut (yalnızca baştaki boşluklar dönüştürülür):

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


1

Ayrıca kullanabilirsiniz astyle. Oldukça yararlı buldum ve birkaç seçeneği de var:

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

Bir satırdaki tüm ardışık boşlukları bir sekme ile değiştirmekten bahsediyorsanız, o zaman 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

Tüm beyaz boşlukları (örneğin boşluk, sekme, yeni satır vb.) Değiştirmekten bahsediyorsanız, o zaman 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  

Sekme hasarlı bir dosyayı düzeltmekten bahsediyorsanız, expandve unexpanddiğer yanıtlarda belirtildiği gibi kullanın .


0

Sed kullanma :

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

veya

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

-1

Bu, ardışık boşlukları bir boşlukla değiştirir (ancak sekme değil).

tr -s '[:blank:]'

Bu, ardışık boşlukları bir sekmeyle değiştirecektir.

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

Aslında, -conunla boşluk olmayan ardışık karakterlerin yerini alır .
wingedsubmariner

1
Soru sekmelerle ilgili, bu bir cevap değil.
Matthew
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.