各行の最初の数文字を削除しようとしましたが、失敗しました/

各行の最初の数文字を削除しようとしましたが、失敗しました/

これをファイルと考えてください。

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:以下を含むすべての行を削除します。ただ ./他にはありません。

関連情報