通过 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
命令输出的行。
我有一个包含冗余 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
命令输出的行。