Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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
如何删除仅在包含字符串的行之后才加倍的行-linux/bash_Linux_String_Bash_Line - Fatal编程技术网

如何删除仅在包含字符串的行之后才加倍的行-linux/bash

如何删除仅在包含字符串的行之后才加倍的行-linux/bash,linux,string,bash,line,Linux,String,Bash,Line,如标题所述。我发现了一个命令,可以删除加倍的行: perl -i.bak -ne 'print if ! $x{$_}++' ~/.bashrc 但如何在包含特定字符串的行之后实现,例如: if line is after line with string "hello" perl -i.bak -ne 'print if ! $x{$_}++' ~/.bashrc 我正在尝试使用bash 您可以使用范围提取操作符。: perl -i.bak -ne 'print if //../h

如标题所述。我发现了一个命令,可以删除加倍的行:

perl -i.bak -ne 'print if ! $x{$_}++' ~/.bashrc
但如何在包含特定字符串的行之后实现,例如:

if line is after line with string "hello"
    perl -i.bak -ne 'print if ! $x{$_}++' ~/.bashrc

我正在尝试使用bash

您可以使用范围提取操作符

perl -i.bak -ne 'print if //../hello/ or !$x{$_}++' ~/.bashrc

有了Ed,这很容易。我还在我所有的文件名中加了一个“+”号,作为文件名和扩展名之间的记录分隔符,这样我就可以用Cut轻松地将它们分开,但如果你愿意,你可以删除它们

文件+.txt:-

hi
hello
hello
there
脚本+.sh:-

#!/bin/sh -x

init () {
cat > edcommands+.txt << EOF
/hello/d
wq
EOF

next
}

end () {
rm ./edcommands+.txt
exit 0
}

next () {
[[ -z $(echo $edresult | grep '?') ]] && main
end
}

main () {
edresult=$(ed -s file+.txt < edcommands+.txt)
next 
}

init
#/bin/sh-x
init(){

cat>edcommands+.txt 1.在包含一些字符串的行之前过滤所有行。输出它。2.在包含一些字符串的行之后过滤所有行。将它作为perl脚本的管道。输出它…有什么线索如何做吗?您只想要基于perl的答案吗?我很乐意回答awk,或者没有外部工具的本机bash,但因为这是标记ged perl…我也很乐意使用其他任何东西:)如果您编辑Q以包含一小部分样本数据和来自该数据的所需输出,我们可以提供更好的帮助。您可以获得额外的分数I您包括您在编写解决方案时的最佳尝试,并显示您当前的输出和任何错误消息。请使用
{}
工具从鼠标上的“编辑”菜单中选择适当格式的文本,如
code/data/output/ErrMsgs
。祝你好运。我的荣幸: