给定标志后删除第二次出现

时间:2019-10-22 17:22:00

标签: regex bash awk sed

如何解析.txt文件中的每一行,以删除文件每一行中给定标志/之后第二次出现jdk之后的所有内容。

例如

/usr/lib/jvm/jdk-1.7.0/2.0/zi/etc/GMT
/usr/lib/jvm/jdk1.7.2/3.0/zi/etc/GMT
/usr/share/servertool-java-openjdk/4.0/jce.jar

成为

/usr/lib/jvm/jdk-1.7.0/2.0/
/usr/lib/jvm/jdk1.7.2/3.0/
/usr/share/servertool-java-openjdk/4.0/

请注意,我不能只对jdk进行拆分,因为它可能是jdk-1.*.*/ etc.

我的最终目标是在受到严格限制的SeLinux盒子上找到所有唯一路径,该盒子上有一个locate jdk的输出存储在output.txt文件中

更新:到目前为止,我要尝试接近的尝试是

cat output.txt | awk -F '\\jdk' '{print $1"jdk"}' | sort -u 

这只会在jdk之后砍掉所有内容,并删除重复项。

2 个答案:

答案 0 :(得分:3)

sed是非常适合此工作的工具。您将使用s///命令删除要删除的行的一部分。

请注意,s///命令中的斜杠可以更改为其他字符,这样,图案中的斜杠或替换零件就无需转义。

您的模式将是:

  • 在捕获括号中:
    • “ jdk”后跟零个或多个非斜杠
    • 后跟斜杠
    • 后跟一个或多个非斜杠
    • 后跟斜杠
  • 后跟任意数量的字符

替换将是捕获的文本。

您将要参考sed manual

答案 1 :(得分:2)

如果要替换为同一文件,可以使用以下脚本

#!/bin/bash
cat output.txt | while read line
do
x=${line#/*jdk*/*/}
replace=${line%${x}}
sed -i "s|$line|$replace|g" output.txt
done