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