Paul Midgette Asked: 2024-05-30 12:33:16 +0800 CST2024-05-30 12:33:16 +0800 CST 2024-05-30 12:33:16 +0800 CST 使用 sed 或 awk,当下一行以相同内容开头并后跟斜杠时,如何删除一行? 772 使用 sed 或 awk,当下一行以相同内容开头并后跟斜杠时,如何删除一行? awk 3 个回答 Voted Stéphane Chazelas 2024-05-30T13:49:01+08:002024-05-30T13:49:01+08:00 可能: sed '$!{N; /^\(.*\)\n\1\//!P; D;}' 其中(除非到达最后一行 ( $!)): N将下一行追加到模式空间。 /^\(.*\)\n\1\//!P P打印模式空间中的第一行,除非它包含一行,后跟同一行,后跟/。 D然后删除该行并循环回到开头,其余行仍在模式中。 Best Answer aviro 2024-05-30T17:30:46+08:002024-05-30T17:30:46+08:00 和awk: awk 'NR==1 {prev=$0; next} index($0 ,prev"/") != 1 {print prev} {prev=$0} END {if (NR>0) print prev}' FILENAME 多行以提高可读性: awk ' NR==1 {prev=$0; next} index($0, prev"/") != 1 {print prev} {prev=$0} END {if (NR>0) print prev} ' FILENAME 将文件的第一行复制到名为 的变量中prev并跳到下一行。 从第二行开始,检查prev+是否/与当前行 ( ) 的开头(索引 1)匹配$0。如果没有,则打印上一行。 将当前行 ( $0) 复制到prev。 完成awk读取文件后,打印最后一行 ( prev),除非文件为空。 cibpeerb 2024-05-30T13:28:11+08:002024-05-30T13:28:11+08:00 sed(1)你可以用+ sort(1)+来做到这一点join(1): 首先确保文件已排序。 sort file -o file 然后使用sed(1)获取要删除的条目列表: sed 's/\/[^/]*$//' file | sort -u > toremove 最后使用join(1)来完成工作: join -v 1 file toremove
可能:
其中(除非到达最后一行 (
$!
)):N
将下一行追加到模式空间。/^\(.*\)\n\1\//!P
P
打印模式空间中的第一行,除非它包含一行,后跟同一行,后跟/
。D
然后删除该行并循环回到开头,其余行仍在模式中。和
awk
:多行以提高可读性:
prev
并跳到下一行。prev
+是否/
与当前行 ( ) 的开头(索引 1)匹配$0
。如果没有,则打印上一行。$0
) 复制到prev
。awk
读取文件后,打印最后一行 (prev
),除非文件为空。sed(1)
你可以用+sort(1)
+来做到这一点join(1)
:sed(1)
获取要删除的条目列表:join(1)
来完成工作: