次のファイルがあります。
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では正規表現がスラッシュで区切られていることです。正規表現にスラッシュを入れるには、バックスラッシュでエスケープする必要があります。Reg
Ex
//
/
\
まったく、模様{行動}は実行を意味します。行動現在行が一致する場合模様。この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