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

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

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

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+:$

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

答え2

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

sed を使用できます:

$ sed 's/[0-9]*: [a-z ]*/&\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

答え3

awk問題を解決しているようです。

$ awk '{ for( i=1; i<=NF; i++ ) { if( match( $i, ":" ) ) { printf "\n" } printf( "%s ", $i ) } }' /path/to/file
random_string
83: some words
45: large error report
326: email certain people random_string
34: some words
143: job success

答え4

入力と出力を比較すると、目的の内容の説明が間違っているようです。あなたは言う「パターン#:(コロンの後に続く数字)を探して、その後に新しい行を追加したいと思います。」より正確な説明は次のとおりです。

  • 数字の前のスペースを改行文字に置き換え、その後にコロンが続きます。
  • 数字で始まらず、空でない各行の前に改行文字を挿入します。
  • 何も変更する必要はないので、入力の最初の行をスキップします。

このsedスクリプトはこれを達成します。必要なバックスラッシュエスケープ回数を最小限に抑え、読みやすくするために、デフォルトのデフォルト正規表現の代わりに拡張正規-E表現()を使用します。sed

$ sed -E -e '2,$ {s/ ([0-9]+:)/\n\1/g; s/^[^0-9]/\n&/}' file.txt
random_string
83: some words
45: large error report
326: send emails to certain peple

random_string
34: some words
143: job success

[0-9]+:ただし、1つ以上のスペース文字の前にスペースの代わりにタブ文字がある場合は、スペースの代わりに[[:space:]]+タブ文字を使用してください。例えば

sed -E -e '2,$ {s/[[:space:]]+([0-9]+:)/\n\1/g; s/^[^0-9]/\n&/}' file.txt

関連情報