式の後に新しい行を追加する方法

式の後に新しい行を追加する方法

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

random_string
83: some words 45: large error report 326: send emails to certain peple
random_string
34: some words 143: job success

「#:」パターン(数字の後にコロンがある)を見つけ、それに続くテキストの後に新しい行を追加して、次のように読みたいと思います。

random_string
83: some words
45: large error report
326: email certain people

random_string
34: some words
143: job success

私はsedコマンドを試しました。

sed "s#'([0-9]*[0-9]:)'#a '/n'#" file.txt
sed "s#'([0-9]*[0-9]:)'#\n#g" file.txt

(スラッシュを区切り文字として使用するのは好きではありません。フェンス柱のため、読みにくいです。)

そしてawkコマンド:

awk '/[0-9]*[0-9]:/ {printf "%s\n",$0}' file.txt

しかし、どちらも機能しません。ここに投稿された同様の質問を見て解決策を試しましたが、何も起こりませんでした。私は答えがおそらく非常によく似ているかもしれませんが、私の数式の構文に関連しているかもしれないことを知っていますが、それを自分で理解することはできません。私はawkとsedを好みませんが、これが私が使用できる最高のツールになると思います。

助ける?

ベストアンサー1

Perlソリューションは次のとおりです。

$ perl -pe 's/(\d+:.*?)(?=\d+:|$)/$1\n/g' file
random_string
83: some words 
45: large error report 
326: send emails to certain peple

random_string
34: some words 
143: job success

説明する

  • (\d+:.*?):1つ以上の数字(\d+)と一致し、:その後にaが続き、残りの正規表現と一致する最小の文字列が続きます(inは貪欲になり、?最初の一致が見つかると停止します)。.*?ここでは、以下のセクションに進みます。
  • (?=\d+:|$):これは(?=foo)肯定的な見通し。一致しますが、一致する内容は実際の結果には含まれません。したがって、それ以降のすべてのケースがbar(?=foo)一致します。ここでは、()または行末()が続く一連の数字を探します。barfoo:\d+:$

代替演算子は、最初のパターンのすべての項目を自分と改行文字で置き換えて、目的の出力を提供します。

おすすめ記事