私が経験している問題は、2つの区切り記号のセット(上と下)を一致させることです。
下の区切り記号の2番目の部分(太字)のみを一致させようとしています。
これにより、同じ日に作成された新しいバージョンを複数のファイルに追加できます。 Perlを使用すると、置換を実行すると次のような結果が得られます。
とにかく、https://regex101.com/(そしてコマンドを実行したときの私の経験)2つの区切り文字のセットを選択します。
これは私が使用する正規表現です。
(?!V[0-9]{2}.[0-9]{2}.[0-9]{4}.1)(.*=.$)
UNIXのコマンド:
perl -pe 's#(?!V[0-9]{2}.[0-9]{2}.[0-9]{4}.1)(.*=.$)#-* V02.11.2020.1 11/Feb/2020 Author2 Minor Changed Include lms \n -* ================ ============= ==================== =========== ========================================================/#g' path/to/file
以下から選択する方法はありますか?それとも、問題はNegative Lookaheadで発生しますか? -************************************************* ***************************************
編集
bey0ndが選択したコマンドを使用しました
3,$s/ -\* =[=[:space:]]*\// -* V02.11.2020.1\t 11\/Feb\/2020\t Author2\t\t Minor\tChange include 1ms\n\0/1
読みやすさに大いに役立ちます
ただし、まだ2つの区切り記号(=記号)を置き換えます。正規表現のツアー機能が役に立つと思います。
私はPerl 5とsed 4.2を使用しています。
少なくともregex101.comでは動作しますが、私のバージョンでは動作しません。
誰かが役に立つと思います。
(-\* =[=[:space:]]*\/)(?!\n.-\*[[:space:]].V[0-9]{2}.[0-9]{2}.[0-9]{4}.1*)
答え1
これは私が使用するsedコマンドです:
sed -e '3,$s/ -\* =[=[:space:]]*\// -* V02.11.2020.1\t11\/Feb\/2020\tAuthor2\tMinor\tChange include 1ms\n\0/' file
タブをレイアウトに合わせて調整する必要があります。
答え2
スクリプトに追加したい内容があるようです。次のテキストを含む testfile.txt というファイルを作成しました。
-* some lines
-* some more lines
-* ======= ====== ======= ======= =======/
-* data data data
-* more data more data more data
-* ====== ====== ======= ======= ======/
私はあなたの特定の要件に合わせてカスタマイズできるファイルとほぼ同じように見えるようにしました。次のコマンド(シェルスクリプトに入力できます)は、2番目の区切り文字(データセクションの最後)の前に「新しいデータの挿入新しいデータの挿入新しいデータの挿入」を挿入します。私はこれがあなたが望むものであることを理解しています。
lines=`grep -nEe "=+" testfile.txt | sed -e s/":.*"//`
lines=`echo $lines`
read line1 line2 <<< $lines
sed -i ${line2}i"-* inserting new data inserting new data inserting new data" testfile.txt
私の最後のファイルは今
-* some lines
-* some more lines
-* ======= ====== ======= ======= =======/
-* data data data
-* more data more data more data
-* inserting new data inserting new data inserting new data
-* ====== ====== ======= ======= ======/
これにより、お客様の質問の理解が効果的に完了しました。この作業を完了する前に解決する必要がある他の問題があるかどうかを明確にしてください。
私の正規表現はとても簡単です。すべての等号のある行で一致を強制的に適用し、ファイルが「うまくいく」と仮定します。ファイルの内容が異なる場合(たとえば、区切られていない行に等号を含めることができる場合)、より具体的な正規表現が必要になる場合があります。あなたの質問は、正規表現を直接書くことができ、2番目の一致を得るのに助けが必要であることを意味すると思います。また、私はあなたが2番目のゲームだけを望んでいると仮定しており、常に2つのゲームがあることに注意してください。
最初のコマンドは、パターンに一致するすべての行番号を変数に保存しますlines
。 2番目のコマンドは、変数から何らかの誤った文字lines
(何がわかりません)を消去して空白で区切るようにします。 3番目のコマンドは、一致する各行番号を独自の変数に格納します(ここでは正確に2つの一致があると仮定します)。 4番目は、2番目の一致の前に必要な新しいデータを挿入します。
答え3
私はPoisson Aeroheadのアプローチがおそらくより良いアプローチだと思います。
私はちょっと複雑さを排除したいと思います。
line=`grep -n '^ -\* =*' testfile.txt | tail -1 |sed -e s/:.*//`
sed -i ${line}i'\ -* inserting new data ' testfile.txt
以下のように行が1つしかない場合でも(この場合は最後の行でもあります)、「-* ==」で始まる最後の行の前にデータが挿入されます。
行がない場合は、各行の前に挿入されます!