GNU/Linux >> Linux の 問題 >  >> Ubuntu

パターンを行頭に移動しますか?

行の先頭に日付と時刻が表示されるようにログファイルを再フォーマットしようとしています。私のログは次のようになります:

blah, blah, blah, Friday, Mar 13,2015 16:59:42
yadi, yadi, yada, Friday, Mar 13,2015 16:51:11

このように見せてほしい:

Friday, Mar 13,2015 16:59:42 blah, blah, blah
Friday, Mar 13,2015 16:51:11 yadi, yadi, yada

grep -o -i -e '[a-zA-Z]*, [a-z][a-z][a-z] [0-9]*,[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]' ~/log.txt

これらのパターン結果を情報文字列の左側に移動するにはどうすればよいですか?助けてくれてありがとう。

承認された回答:

sedをお試しください 次の正規表現を使用:

$ sed -i.bak 's_\(.*\),[[:blank:]]\([[:alpha:]]\+,[[:blank:]][[:alpha:]]\+[[:blank:]][[:digit:]]\+,[^,]\+$\)_\2 \1_' file.txt 
Friday, Mar 13,2015 16:59:42 blah, blah, blah
Friday, Mar 13,2015 16:51:11 yadi, yadi, yada

ここでは、sedを使用しました 目的の出力を取得するためののグループ置換方法。

  • \(.*\) blah, blah, blahまで一致します ,[[:blank:]]があるので ,に一致する その後。
  • \([[:alpha:]]\+,[[:blank:]][[:alpha:]]\+[[:blank:]][[:digit:]]\+,[^,]\+$\) 行の残りの部分(最初に配置したい部分)と一致します。

次に、\2 \1があります。 最初に2番目のグループを配置し、次にスペース、次に最初のグループを配置します。

元のファイルはfile.txt.bakとしてバックアップされます 、それを望まない場合は、-iだけを使用してください -i.bakの代わりに 。

**目的の出力が得られますが、この場合、正規表現/sedを使用することは最適なソリューションではありません。

編集: [Internet disconnected] Friday, Mar 13,2015 15:48:34のような行がある場合 、これを試してください:

$ sed -i.bak 's_\(.*[^,]\),*[[:blank:]]\([[:alpha:]]\+,[[:blank:]][[:alpha:]]\+[[:blank:]][[:digit:]]\+,[^,]\+$\)_\2 \1_' file.txt 
Friday, Mar 13,2015 15:48:34 [Internet disconnected]
Friday, Mar 13,2015 16:59:42 blah, blah, blah
Friday, Mar 13,2015 16:51:11 yadi, yadi, yada

以前の正規表現では、\(.*\),[[:blank:]]がありました (最初の一致するグループの後のコンマと空白)、出力に新しい行を含めるために、最初の一致するグループ\(.*[^,]\)を作成しました。 カンマで終わっていないことを確認し、,*と一致させます つまり、1つ以上のコンマ。つまり、新しいsed コマンドは、言及されたすべての場合に機能します。

関連:長時間実行されているスクリプト中にSudoがタイムアウトしますか?
Ubuntu
  1. Sedを使用してパターン範囲間の行を検索および置換

  2. Vimの各行の先頭にテキストを挿入する方法

  3. Sedを使用してパターンマッチ後に前の行を印刷しますか?

  1. テキストファイルの行を1行上または下に移動するにはどうすればよいですか?

  2. IntelliJ IDEA (Linux):行頭/行末に移動

  3. csh の行頭のアンパサンド

  1. パターンを見つけて移動しますか?

  2. 各行でN番目の一致が見つかった後のパターンの置き換え??

  3. マッチングパターンの後にラインの一部のみを返しますか?