如何删除某个字符串之前的所有文本

如何删除某个字符串之前的所有文本

最近,我找到了这个解决方案,它对我有用,因为我总是使用带有某些日期和时间的命令,也就是说,该字符串在我的情况下几乎总是唯一的。

sed -n -i '/some_string_here/,$p' file_here

但最近我需要使用其他类型的字符串(没有日期和时间)

问题是,这个解决方案只能从第一次出现开始起作用

[oracle@server1 ~]$ cat arquivo
OPERATIONAL SYSTEMS:
Windows
MAC OS
OPERATIONAL SYSTEMS TOMORROW:
Linux
Xubunto
OPERATIONAL SYSTEMS TOMORROW:
AIX
SOLARIS

[oracle@server1 ~]$ sed -n -i '/OPERATIONAL SYSTEMS TOMORROW:/,$p' arquivo
[oracle@server1 ~]$ cat arquivo
OPERATIONAL SYSTEMS TOMORROW:
Linux
Xubunto
OPERATIONAL SYSTEMS TOMORROW:
AIX
SOLARIS

我需要做这样的事情来打印从最后一次出现到OPERATIONAL SYSTEMS TOMORROW:最后的内容。

[oracle@server1 ~]$ cat arquivo
OPERATIONAL SYSTEMS:
Windows
MAC OS
OPERATIONAL SYSTEMS TOMORROW:
Linux
Xubunto
OPERATIONAL SYSTEMS TOMORROW:
AIX
SOLARIS

[oracle@server1 ~]$ sed -n -i 'some command for it' arquivo
[oracle@server1 ~]$ cat arquivo
OPERATIONAL SYSTEMS TOMORROW:
AIX
SOLARIS

我该怎么做?

答案1

这是一行sed

sed -n 'H; /^OPERATIONAL SYSTEMS TOMORROW:/h; ${g;p;}' arquivo

输出:

OPERATIONAL SYSTEMS TOMORROW:
AIX
SOLARIS

要就地编辑文件:

sed -i -n 'H; /^OPERATIONAL SYSTEMS TOMORROW:/h; ${g;p;}' arquivo

答案2

交换文件中行的顺序,得到第一的几行,然后再次交换它们:

$ tac file | sed '/OPERATIONAL SYSTEMS TOMORROW:/q' | tac
OPERATIONAL SYSTEMS TOMORROW:
AIX
SOLARIS

这可能不是高效的,但它很简单,因此易于理解和维护。

tac实用程序是 GNU coreutils 的一部分。

答案3

您可以使用纯 sh 来执行此操作

${VAR%%string}

其中 $VAR 包含您要处理的文本

答案4

使用 perl (可能比 awk 和 sed 更快):

$ cat temp.txt
OPERATIONAL SYSTEMS:
Windows
MAC OS
OPERATIONAL SYSTEMS TOMORROW:
Linux
Xubunto
Extra
OPERATIONAL SYSTEMS:
Windows
MAC OS
OPERATIONAL SYSTEMS TOMORROW:
AIX
SOLARIS  

执行:

$ perl -ne ' {
  if ( $_ =~ /(OPERATIONAL SYSTEMS TOMORROW:)/ ) {$found=1;$index=0;}
  if($found ) {$index++; $a[$index]=$_;} $last_index=$index;}
  END {
  for($i=1;$i<=$index;$i++){ print $a[$i];}
  } ' temp.txt

相关内容