将此视为文件:
M ../.gitlab-ci.yml
M ../force-app/main/ui/classes/test.cls
A ../pmd/get_diff_branches.sh
?? ../assets/server.key
?? ./
我将从行中一一删除所有额外的字符,如下所示:
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
支持的话,只需用 分隔它们;
。另外,您的命令之一只会复制一行: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/^[^ ]* *//
:从行首删除所有非空格字符,后跟 0 个或多个空格。/\/force-app\/package\.xml/d
:如果该行匹配/force-app/package.xml
,则删除它。我在这里猜测,因为您的示例不包含任何与此模式匹配的行。您正在使用^force-app...
,但这不可能是正确的,因为您/
在它之前总是有一个。/^\.\/$/d
:删除包含以下内容的所有行仅有的./
没有别的。