Unix: テキストの記号の後に識別名を追加する

Unix: テキストの記号の後に識別名を追加する

次のファイルがあります。

abcdefghijklmnopqrst
//
abcdefghijklmnopqrst
//
abcdefghijklmnopqrst

次のコードを使用して、ドキュメントの先頭に//行を挿入しました(ここで提案されているように:テキストファイルの先頭にテキストを追加する)このアップデートを新しいファイルに保存します。

sed '1s/^/\/\/\'$'\n/' File_1.txt > File_2.txt

しかし、私が望むのは、各//の後に一意の名前を追加することです。結果は次のとおりです。

// Text 1
abcdefghijklmnopqrst
// Text 2
abcdefghijklmnopqrst
// Text 3
abcdefghijklmnopqrst

など。

たとえば、trを使って翻訳できると思います。 「//」を「//Text1」に変換します。しかし、次の//にテキスト2を追加し、3番目の//などにテキスト3を追加するにはどうすればよいですか? txt ファイルは mac-osx で生成されます。

修正する:

あなたの解決策はよさそうだ。 @PM 2Ring。しかし、追加の質問があります。ファイルは実際には次のようになります。

// 
abcdefghijklmnopqrstu 
//            x   x 
abcdefghijklmnopqrstu 
//          x   x 
abcdefghijklmnopqrstu 

したがって、名前は最初の行に完全に挿入されますが、2番目の/ペアの後に行末のxの後に名前が挿入されます。 //の後に名前を挿入する必要がありますが、残りのテキストを右に移動しないでください。名前の文字数だけスペースを削除できますか?もちろん、最初の行ではこれを行うべきではありません。これは、2行目の文字が削除されると思うからです。

答え1

次の方法で簡単にこれを行うことができますawk

awk 'BEGIN{n=1}; /\/\//{$0=$0 " Text " n; n+=1}; {print}' infile

infile以下を含む場合

//
abcdefghijklmnopqrst
//
abcdefghijklmnopqrst
//
abcdefghijklmnopqrst

上記のコマンドが印刷されます。

// Text 1
abcdefghijklmnopqrst
// Text 2
abcdefghijklmnopqrst
// Text 3
abcdefghijklmnopqrst

奇妙に見えるのは、/\/\//awkでは正規表現がスラッシュで区切られていることです。正規表現にスラッシュを入れるには、バックスラッシュでエスケープする必要があります。RegEx///\

まったく、模様{行動}は実行を意味します。行動現在行が一致する場合模様。このBEGINモードは、行を読み取る前に発生するアクションを表す特殊モードです。パターンを指定しないと、すべての行でアクションが実行されます(これをオーバーライドする方法があります)。


この更新されたバージョンは新しい入力ファイルで機能しますが、残念ながら空白は保持されません。

awk 'BEGIN{n=1}; /^\/\//{$1=$1 " Text " n; n+=1}; {print}' infile

入力する

// x  x
abcdefghijklmnopqrst
//    x    x
abcdefghijklmnopqrst
//          x   x
abcdefghijklmnopqrst

出力

// Text 1 x x
abcdefghijklmnopqrst
// Text 2 x x
abcdefghijklmnopqrst
// Text 3 x x
abcdefghijklmnopqrst

答え2

および評価フラグを使用して、perl代替セクションの変数を増やすことができます。数字で始まり//Textその後に数字を追加するすべての行を検索します。

perl -pe 's{\A(//)}{$1 . " Text " . ++$i}e' File_1.txt

それは次のものを生成します:

// Text 1 
abcdefghijklmnopqrst
// Text 2 
abcdefghijklmnopqrst
// Text 3  
abcdefghijklmnopqrst

修正する(コメントを参照):

次のスペースをグループ化//し、交換部品に挿入するスペースの数を計算します。例:

perl -pe 's{\A(//)(\h*)}{$1 . " Text " . ++$i . " " x ((length ($2)) - length(" Text " . $i))}e' temp

最後の例では、次のようになります。

// Text 1
abcdefghijklmnopqrstu 
// Text 2     x   x 
abcdefghijklmnopqrstu 
// Text 3   x   x
abcdefghijklmnopqrstu

答え3

@Bireiのソリューションを「追加の問題」アップデートに変換:

perl -pe 's{^// {10}}{sprintf("// Text %-3d ",++$i)}e  or
          s{^//     }{sprintf("// Text %d",   ++$i)}ex '          infile

関連情報