通过 Bash 中的部分匹配过滤文件的行

Filter lines of a file through partial matches in Bash

我有一个包含冗余 Git 语句的文件,如下所示:

git fetch
git checkout foo
git checkout bar
git checkout baz
git merge origin/baz

结帐语句是多余的,我想只保留最后一个,这样文件最终看起来像这样:

git fetch
git checkout baz
git merge origin/baz

我只能使用 Bash 脚本。我该怎么做?

试试这个 awk 命令:

tac input.txt | awk '{cmd = }; cmd != last; {last = cmd}' | tac

结果:

git fetch
git checkout baz
git merge origin/baz

sed 有一种方便的方式来打印一行中最后一次出现的模式:

sed '/checkout/h; $!d; x' file

其中,在您的情况下将提取字符串 git checkout baz

然后您可以在脚本中使用它,将 sed 输出保存到一个变量,并使用它打印出您指定的所有行:

file=
line=$(sed '/checkout/h; $!d; x' $file)
sed -n "/checkout/!p;/$line/p" $file

最后的 sed 状态,打印所有不包含 checkout 的行,以及包含第一个 sed 命令输出的行。