一致する各行の先頭にスペースを追加します


2

たとえば、最初に開始する行があり、それが前の行と並ぶために必要な場合、どうすれば最も効果的にそれを行うことができますか。

      preceeding line
line I need to add spaces to

したがって、次のようになります。

       predeeding line
       where it needs to start. 

開始する必要がある場所からちょうど8スペース離れています。vim、awk、sed、または別のツールでこれを行うにはどうすればよいですか?

その他の要件/注意:

これらの行はファイル内で複数回発生し、100〜500行の間でのみ変更を行います。


1
すべての行を8スペースでインデントしますか?または、前の行のインデントを一致させますか?インデントされていない2行以上の行が連続して表示された場合:最初のインデントのみにインデントを指定する必要がありますか?または、それらはすべてインデントを取得しますか?
John1024

前の行のインデントと一致します。前の行に完全に一致する限り、追加したい行の前にあるインデントされていない行はありません。
user53029

はっきりさせてください-インデントされた行と一致してその下の行に変更を加えることができる限り、インデントされていない行が干渉することはありません。
user53029

これは、Vimの自動インデントの単純な例のように見えます。あなたが正しいインデントと呼び出しで行の下から始めるとどうなります==か?これを100-500にするには、行101から開始し(100に正しいインデントがあると仮定)、次に399==、上の行のような次の399行を自動インデントするように入力します。
-Shadoath

回答:


1

このテストファイルについて考えてみましょう。

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

次の例は、前の行のインデントと一致するように、インデントされていない行をインデントします。

$ 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

使い方

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

    xの先頭が空白でもタブでもない場合、行の先頭にインデントを追加します。

    そうでない場合は、変数の現在の行のインデントを保存しますx

  • 1

    これは、行を印刷するためのawkの不可解な速記です。

複数行バージョン

コードが複数行に広がることを好む人向け:

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

    1' file1

行100〜500への変更を制限する

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

ファイルをその場で変更する

GNU awkの使用:

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

BSD / OSX awkの使用:

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

2

vimで:

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

説明:

vimの「global」コマンドは、特定の正規表現に一致するすべての行にexコマンドを適用します。これは、特定の範囲の行(この場合は100〜500)に制限できます。ここの正規表現は

^[^ ]

これは、行頭のスペースを除く任意の文字意味します。exコマンドは

normal 0ky^jP

これが何をするか:

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

これを実行した後、呼び出すだけ

:wq

ファイルを保存して終了します。これはすべてコマンドラインからも実行できます。

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

別の代替ソリューション:

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

0

宿題?;->

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

これは、必要な行だけでなく、すべての行をインデントしませんか?
user53029

はい、すべての行の先頭に8個のスペースを追加し、現在存在する任意の数のスペースを置き換えます。
dr.nixon
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.