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.