次のファイルがあります。
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
答え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