これをファイルと考えてください。
M ../.gitlab-ci.yml
M ../force-app/main/ui/classes/test.cls
A ../pmd/get_diff_branches.sh
?? ../assets/server.key
?? ./
次のように、行からすべての追加文字を1つずつ削除します。
sed /^D/d diff.txt | sed 's/^..//' | sed /^force-app/p | sed /^force-app\\/package\.xml/d | sed 's/.*\ ->\ //' > temp.txt
これを実行した後、ファイルは次のようになります。
../.gitlab-ci.yml
../assets/server.key
../force-app/main/ui/classes/test.cls
../pmd/get_diff_branches.sh
./
同じ行からどのように./
削除しますか?別のコマンドを書くと、すべての行から削除が始まりますが、上記のコードスニペットの最後の行と正確に一致する場合にのみ削除したいと./
思います。./
オペレーティングシステム:Linux 10
答え1
まず、別のsed
コマンドは必要ありません。複数のコマンドを一緒にまとめること-e
ができ、sed
サポートしている場合;
。また、コマンドの1つは1行だけコピーしますsed /^force-app/p
。これは、行を繰り返さない場合にのみsed -n
意味があります(抑制印刷を使用する場合)。
GNUがある場合は、次のようにしますsed
。
$ sed 's/^[^ ]* *//; /\/force-app\/package\.xml/d; /^\.\/$/d' file
../.gitlab-ci.yml
../force-app/main/ui/classes/test.cls
../pmd/get_diff_branches.sh
../assets/server.key
GNUがない場合は、以下をsed
試してください。
$ sed -e 's/^[^ ]* *//' -e '/\/force-app\/package\.xml/d' -e '/^\.\/$/d' file
../.gitlab-ci.yml
../force-app/main/ui/classes/test.cls
../pmd/get_diff_branches.sh
../assets/server.key
コマンドは次のとおりです。
s/^[^ ]* *//
:行の先頭から空白以外のすべての文字を削除し、その後にゼロ個以上の空白が続きます。/\/force-app\/package\.xml/d
:行が一致した場合は/force-app/package.xml
削除します。あなたの例には、このパターンに一致する行が含まれていないため、ここで推測しています。を使用していますが、その前に常に1があるので^force-app...
正確ではありません。/
/^\.\/$/d
:以下を含むすべての行を削除します。ただ./
他にはありません。