2012-12-09 48 views
2

我的文本文件按字母顺序排序。我想确定每行是否包含在以下行中,如果是,请删除两行中的第一行。因此,举例来说,如果我有...sed:如何确定第1行是否包含在第2行

car 
car and trailer 
train 

...我想结束了......

car and trailer 
train 

我找到了 “的sed单行” 页面(S) ,该代码具有搜出双线的代码:

sed'$!N; /^(.*)\n\1$/!P; D'

...我想删除^会做伎俩,但它没有。

(这也将是不错的与非连续的线条要做到这一点,但我的文件运行到千行,它可能会采取一个脚本数小时或数天,跑。)

+0

忽略案例会是一个优点。 – user1889034

+0

由于您的RE在末尾包含'$'符号,这意味着* line1完全匹配line2 *而非* line1包含在line2中* –

+0

作为相关建议,为什么我们不简单地编写几条python行来完成此任务? – sleepsort

回答

2

原命令

sed '$!N; /^\(.*\)\n\1$/!P; D' 

寻找准确的线匹配。由于您想检查第一行是否包含在第二行中,因此您需要添加一些通配符:

sed '$!N; /^\(.*\)\n.*\1.*$/!P; D' 

应该这样做。

+0

没有:我的样品,'echo $'cat \ ncat和dog \ nhouse \ nmoney \ ngold和money \ n'',这个印刷品'房子'也是。 –

+0

呃。感谢编辑家伙。在我的手机上,我只是从OP中复制了cmd,没有发现缺失的大括号。 :) – TheRuss

+0

@ F.Hauri房子应该打印下面它不包含房子的线。 – TheRuss

0

你说:

这也将是不错的与非连续的行做到这一点。

这里是一个bash脚本,以除去包含在另一行中,不一定是连续的,不区分大小写的所有短行:

#!/bin/bash 
# sed with I and Q are gnu extensions: 
cat test.txt | while read line; do 
    echo Searching for: $line 
    sed -n "/.$line/IQ99;/$line./IQ99" test.txt # or grep -i 
    if [ $? -eq 99 ]; then 
     echo Removing: $line 
     sed -i "/^$line$/d" test.txt 
    fi 
done 

测试:

$ cat test.txt 
Boat 
Car 
Train and boat 
car and cat 

$ my_script 
Searching for: Boat 
Removing: Boat 
Searching for: Car 
Removing: Car 
Searching for: Train and boat 
Searching for: car and cat 

$ cat test.txt 
Train and boat 
car and cat 
+0

这是非常有帮助的!谢谢你们! – user1889034

2

sed的是一个极好的工具在单行上进行简单替换,其他任何只是使用awk:

awk '$0 !~ prev{print prev} {prev=$0} END{print}' file 
相关问题