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

おすすめ記事