sed:如何确定第1行是否包含在第2行中

sed:如何确定第1行是否包含在第2行中,sed,Sed,我的文本文件按字母顺序排序。我想确定每一行是否包含在下一行中,如果是,请删除这两行中的第一行。例如,如果我有 car car and trailer train 。。。我想以 car and trailer train 我找到了“sed one liners”页面,其中包含搜索重复行的代码: sed'$!N/^(.*)\n\1$/!PD' 。。。我想删除“^”就行了,但事实并非如此 (使用非连续的行也很好,但我的文件可以运行数千行,运行脚本可能需要数小时或数天。)原始命令 sed '$!N

我的文本文件按字母顺序排序。我想确定每一行是否包含在下一行中,如果是,请删除这两行中的第一行。例如,如果我有

car 
car and trailer
train
。。。我想以

car and trailer
train
我找到了“sed one liners”页面,其中包含搜索重复行的代码:

sed'$!N/^(.*)\n\1$/!PD'

。。。我想删除“^”就行了,但事实并非如此

(使用非连续的行也很好,但我的文件可以运行数千行,运行脚本可能需要数小时或数天。)

原始命令

sed '$!N; /^\(.*\)\n\1$/!P; D'
查找精确的线条匹配。由于要检查第一行是否包含在第二行中,因此需要添加一些通配符:

sed '$!N; /^\(.*\)\n.*\1.*$/!P; D'
应该这样做。

原始命令

sed '$!N; /^\(.*\)\n\1$/!P; D'
查找精确的线条匹配。由于要检查第一行是否包含在第二行中,因此需要添加一些通配符:

sed '$!N; /^\(.*\)\n.*\1.*$/!P; D'
应该这样做。

你说:

使用非连续的行也很好

下面是一个
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
测试:

你说:

使用非连续的行也很好

下面是一个
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
测试:


sed是一个很好的工具,用于在一行上进行简单替换,对于任何其他内容,只需使用awk:

awk '$0 !~ prev{print prev} {prev=$0} END{print}' file

sed是一个很好的工具,用于在一行上进行简单替换,对于任何其他内容,只需使用awk:

awk '$0 !~ prev{print prev} {prev=$0} END{print}' file

忽略大小写将是一个加号。因为您的RE在末尾包含一个符号
$
,这意味着line1完全匹配line2而不是line1包含在line2中。作为相关建议,我们为什么不简单地编写几行python代码来完成此任务呢?忽略大小写将是一个加号。因为您的RE在末尾包含一个符号
$
,这意味着line1与line2完全匹配line2而非line1包含在line2中作为相关建议,我们为什么不简单地编写几行python来完成这项任务呢?否:根据我的示例,
echo$'cat\ncat and dog\nhouse\nmoney\ngold and money\n'
,这张打印的
house
。谢谢你们的编辑。在我的手机上,所以我只是从OP中复制了cmd,没有发现括号丢失。:)@F.Hauri house应该打印,因为它后面的行不包含house。否:对于我的样本,
echo$'cat\ncat和dog\nhouse\nmoney\ngold和money\n'
,这张打印的
house
。谢谢你们的编辑。在我的手机上,所以我只是从OP中复制了cmd,没有发现括号丢失。:)@F.Hauri house应该打印,因为它后面的行不包含house。这非常有用!谢谢大家!!这很有帮助!谢谢大家!!