Her eşleşen satırın başına boşluk ekle


2

Örneğin, başlangıçta başlamış bir hattım olsaydı ve önceki satırla aynı hizada olması gerekiyorsa, bunu en etkili şekilde nasıl yapabilirdim.

      preceeding line
line I need to add spaces to

Yani şöyle görünüyor:

       predeeding line
       where it needs to start. 

Başlamak için ihtiyaç duyduğu yerden tam 8 boşluk uzakta. Bunu vim, awk veya sed veya başka bir araçla nasıl yapabilirim?

Diğer şartlar / notlar:

Bu satırlar dosyamda birden çok kez oluşuyor ve ben sadece 100-500 numaralı satırlar arasında değişiklik yapmak istiyorum.


1
Tüm çizgilerin 8 boşlukla girintili olmasını ister misiniz? Veya, önceki satırdaki girintiyi eşleştirmek ister misiniz? Ya iki veya daha fazla girintili olmayan satır üst üste görünürse: sadece ilk girintiyi verilsin mi? Yoksa hepsi girintili mi?
— John1024

Yukarıdaki satırdan girintiyi eşleştirin. Önceki satırda tam olarak eşleşebildiğimiz sürece, eklemek istediğim çizgiden önce gelen girintili olmayan çizgiler olmamalıdır.
— user53029

Açıklığa kavuşturmama izin verin - altındaki çizgide değişiklik yapmak için girintili çizgiyle eşleşebildiğimiz sürece, karışacak girintili olmayan çizgiler olmamalıdır.
— user53029

Bu, Vimin için basit bir dava gibi görünüyor otomatik girinti . Çizginin altından doğru girinti ve çağrı ile başladığınızda ne olur? ==? Bunu 100-500 yapmak için 101 satırından başlayın (100'ün doğru girintiye sahip olduğunu varsayarak) ve sonra yazın 399== Bir sonraki 399 çizgisini, üstündeki çizgi gibi otomatik girintili hale getirmek için.
— Shadoath

Yanıtlar:


1

Bu test dosyasını düşünelim:

$ cat file1
      preceeding line
line I need to add spaces to
    preceeding line
  preceeding line
line I need to add spaces to

Aşağıda, girintisiz satırları önceki satırın girintisine uyacak şekilde girintiler:

$ awk '{if (/^[^ \t]/) $0=x $0; else {x=$0; sub(/[^ \t].*/, "", x);}} 1' file1
      preceeding line
      line I need to add spaces to
    preceeding line
  preceeding line
  line I need to add spaces to

Nasıl çalışır

  • if (/^[^ \t]/) $0=x $0; else {x=$0; sub(/[^ \t].*/, "", x);}

    Satır boş veya sekmeyle başlamazsa, girintiyi ekle x Satırın başına

    Aksi halde, geçerli satırdaki girintiyi değişkende saklayın x.

  • 1

    Bu, çizgi-yazı için awk'ın şifreli kısa yoludur.

Çok hatlı versiyon

Kodlarını birden çok satıra yaymak isteyenler için:

awk '
    {
        if (/^[^ \t]/) 
           $0=x $0
        else { 
            x=$0
            sub(/[^ \t].*/, "", x)
        }
    } 

    1' file1

Değişiklikleri 100'den 500'e kadar olan hatlarla sınırlamak

awk 'NR>=100 && NR<=500 {if (/^[^ \t]/) $0=x $0; else {x=$0; sub(/[^ \t].*/, "", x);}} 1' file1

Yerinde dosyayı değiştirme

GNU awk kullanımı:

awk -i inplace 'NR>=100 && NR<=500 {if (/^[^ \t]/) $0=x $0; else {x=$0; sub(/[^ \t].*/, "", x);}} 1' file1

BSD / OSX awk kullanma:

 awk 'NR>=100 && NR<=500 {if (/^[^ \t]/) $0=x $0; else {x=$0; sub(/[^ \t].*/, "", x);}} 1' file1 >tmp && mv tmp file1

2

Vim'de:

:100,500g/^[^ ]/normal 0ky^jP

Açıklama:

Vim'deki "global" komutu, belirli bir regex ile eşleşen her satıra bir ex komutu uygular. Bu, 100-500 arasındaki bu durumda belirli bir çizgi aralığını sınırlayabilir. Buradaki regex

^[^ ]

Herhangi bir karakter anlamına gelir dışında çizginin başındaki bir boşluk için. Ex komutu

normal 0ky^jP

Bu ne yapar:

0           "Move to the first character on this line
 k          "Move up one line
  y^        "Yank up to the first non-whitespace character
    j       "Move down one line
     P      "Paste what we just yanked

Bunu çalıştırdıktan sonra, sadece ara

:wq

Dosyanızı kaydedip çıkmak için. Bunların hepsini komut satırından da yapabilirsiniz:

vim myfile.txt -c "100,500g/^[^ ]/normal 0ky^jP" -c "wq"

Başka bir alternatif çözüm:

:%s/\v^(\s+).*\n\zs(\S)/\1\2

0

Ödev? ; - & gt;

sed -e '100,500s/^[ ]*/        /' -i file

Bu sadece istediklerimi değil tüm çizgileri girmez miydi?
— user53029

Evet, tüm satırların başına 8 boşluk ekleyerek şu anda mevcut olan tüm boşlukları değiştirir.
— dr.nixon
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.