Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何删除sed中以相同字符开头的两行?_Bash_Shell_Sed_Awk - Fatal编程技术网

Bash 如何删除sed中以相同字符开头的两行?

Bash 如何删除sed中以相同字符开头的两行?,bash,shell,sed,awk,Bash,Shell,Sed,Awk,我有一个文本文件。如果有多个以@开头的连续行,我想删除所有这些行,但最后出现的以@开头的行除外 例如,假设我有输入文件: abc @abc @def 333 @自闭症 @poi @789 输出应为: abc @def 333 @789 您可以将tr与sed一起使用: cat input_file | tr '\n' ' ' | sed s/<pattern>// 您可以将tr与sed一起使用: cat input_file | tr '\n' ' ' | sed s/<pat

我有一个文本文件。如果有多个以@开头的连续行,我想删除所有这些行,但最后出现的以@开头的行除外

例如,假设我有输入文件:

abc

@abc

@def

333

@自闭症

@poi

@789

输出应为:

abc

@def

333

@789


您可以将tr与sed一起使用:

cat input_file | tr '\n' ' ' | sed s/<pattern>//

您可以将tr与sed一起使用:

cat input_file | tr '\n' ' ' | sed s/<pattern>//


多行
sed
解决方案:

sed-n'
$p#始终打印最后一行
N#将下一行追加到模式空间
/@.*\n@/D#删除第一行模式空间(如果两行都有)
#行以@开头,然后重新开始
P#否则打印图案空间的第一行,
D#删除它并重新开始
“填充

多行
sed
解决方案:

sed-n'
$p#始终打印最后一行
N#将下一行追加到模式空间
/@.*\n@/D#删除第一行模式空间(如果两行都有)
#行以@开头,然后重新开始
P#否则打印图案空间的第一行,
D#删除它并重新开始
“填充

我看到了awk标签。因此,我添加了一个awk one liner,它可以解决您的问题:(参见下面的测试)


我看到了awk标签。因此,我添加了一个awk one liner,它可以解决您的问题:(参见下面的测试)


我不认为你能用sed做到这一点,因为它对每一行输入都有效separately@poncha将它与tr一起使用——参见下面的答案。我刚刚发现了tr,但它非常有用。@Kasapo谢谢你的提示。。。但是你需要用文本中不一定出现的字符来替换它。。。不?不,只是用一个空间和计划。。。嗯,我想如果保留换行符是非常重要的,那么是的,你可能必须选择一些时髦的字符(我更喜欢文本文件中不存在的元字符,或者三重@符号或三重管道),我认为awk将是这里的答案…我不认为你可以用sed做到这一点,因为它在每一行输入上都起作用separately@poncha将它与tr一起使用——参见下面的答案。我刚刚发现了tr,但它非常有用。@Kasapo谢谢你的提示。。。但是你需要用文本中不一定出现的字符来替换它。。。不?不,只是用一个空间和计划。。。嗯,我想如果保留换行符是非常重要的,那么是的,你可能必须选择一些时髦的字符(我更喜欢文本文件中不存在的元字符,或者三重@符号或三重管道),我认为awk将是答案……你可能需要稍微调整一下,但它与你提供的输入配合得很好。我将把测试和潜在调试留给您:)+1;)但如果原始字符可以包含空格,则需要使用其他一些足够独特的字符作为分隔符(此时正则表达式也将更改)。事实上,如果您知道某些字符不在文本文件中,您可以使用
tr'\n'#'
或其他字符。或者,如果知道源代码中没有空格,只需将空格改回换行即可+1对于poncha,无论如何,你可能需要稍微调整一下,但是你的输入效果很好。我将把测试和潜在调试留给您:)+1;)但如果原始字符可以包含空格,则需要使用其他一些足够独特的字符作为分隔符(此时正则表达式也将更改)。事实上,如果您知道某些字符不在文本文件中,您可以使用
tr'\n'#'
或其他字符。或者,如果知道源代码中没有空格,只需将空格改回换行即可+无论如何,对于庞查来说,如果两个字之间有两行空白,我认为这将失败。不过,在“\n”中添加星号应该可以做到这一点,对吗?不过,有趣的选项传递给了
sed
!或者更确切地说是
\+
。是的,在
sed
中解决这类问题是一个很好的挑战。信息页面信息量很大。有一件事——如果两个字之间有两行空白,我想这会失败。不过,在“\n”中添加星号应该可以做到这一点,对吗?不过,有趣的选项传递给了
sed
!或者更确切地说是
\+
。是的,在
sed
中解决这类问题是一个很好的挑战。信息页面信息量很大。
/^@/ { last_line=$0; line_to_print=true }
/^[^@]/ { if ( line_to_print == true ) print last_line; print $0; line_to_print=false }
END { if ( line_to_print == true ) print last_line }
kent$  cat a.txt
abc
@abc
@def
333
@asd
@poi
@789

kent$  awk 'BEGIN{FS=""}
        {if(c==$1){l=$0;next;} if(c) print l;c=$1;l=$0;} 
        END{print }' a.txt 
abc
@def
333
@789