次の項目を含むファイルがあるとします。
5. variable1:
10. variable7:
230. variable21803:
「5」などを使わずに、すべての変数を出力にしたいと思います。私が試したことは
grep -Po '(?<=^[0-9] )[.\n]+
ただし、結果は返されません。私はUNIXに初めて触れたので、助けてくれてありがとう。
以下は、前にスペースがある更新されたテストです。
ranodm text
1. variable1:
2. variable10:
3. variable302:
答え1
このgrep
ユーティリティはインライン編集には適していません。標準的な用途は、特定の正規表現または文字列に一致する行を抽出することです。sed
このタイプの編集では、エディタがより一般的に使用されます。
次のコマンドは、sed
ファイルの各行から最初の空白文字の前にあるすべての項目を削除する方法を示します。
$ sed 's/[^ ]* //' file
variable1
variable7
variable21803
この式は、s/[^ ]* //
空白のないゼロ文字以上の後にスペースが続くものと一致します。次に、一致する部分文字列を何もないものに置き換えます(つまり、削除します)。
行の先頭の整数と空白の前に点が一致する必要がある場合は、次のことができます。
$ sed 's/^[[:digit:]]*\. //' file
variable1
variable7
variable21803
これは行の先頭のゼロ以上の数字と一致し、その後にドットとスペースが続きます。一致するものがあれば削除されます。
更新された質問は、各行の両端からデータを削除することとはまったく異なることを要求します。
さまざまな方法でこれを実行できます。次のコマンドは、質問のデータに従って、行から最後のスペースまでの最初のビットを削除し、最後のすべての行から:
最後のビットを削除する方法を示しています。:
$ sed '/:$/ { s///; s/.* //; }' file
ranodm text
variable1
variable10
variable302
または最初にランダムなテキストが必要ない場合:
$ sed -n '/:$/ { s///; s/.* //p; }' file
variable1
variable10
variable302
答え2
Raku(以前のPerl_6)の使用
raku -e 'lines.comb(/ variable \d+ /).join("\n").put;'
入力例:
5. variable1:
10. variable7:
230. variable21803:
ranodm text
1. variable1:
2. variable10:
3. variable302:
出力例:
variable1
variable7
variable21803
variable1
variable10
variable302
上記は、Perlシリーズのプログラミング言語の1つであるRakuでコーディングされたソリューションです。簡単に言えば、Rakuは正規表現マッチングをcomb
使用するルーチンを提供します。/…/
コマンドラインから呼び出すと、-edがlines
読み取りcomb
(スペースは重要ではありません)パターンをvariable \d+
見つけて一致するものを返します。
join("\n")
すべての一致を1行に返すには、その呼び出しを削除してください。
raku -e 'lines.comb(/ variable \d+ /).put;' file
variable1 variable7 variable21803 variable1 variable10 variable302
もちろん、使い慣れた代替演算子(このスレッドの他の場所に公開されているs///
ものなど)を使用するソリューションを含む、Rakuで使用できる他のソリューションがあります。sed
行間隔を維持する別のRakuソリューションは次のとおりです。
raku -ne 'put m:g/ [variable \d+] /;' file
variable1
variable7
variable21803
variable1
variable10
variable302