shell 如何使用sed命令从特定行的开始/结束读取n个字符

1mrurvl1  于 2023-04-21  发布在  Shell
关注(0)|答案(2)|浏览(191)

我有几个文件在一个目录中具有类似的结构:

....  
....
pattern one  
some information Important-1  
....
....
pattern two  
line1  
line2  
line3  
line4  
line5  
Important-2 some information  
....  
....

我需要文件中两个特定行的(重要)信息。
此命令对我有效sed -n '/pattern two/{ n; n; n; n; n; p }; /pattern one/{n; p }' * > output.txt
它会给我这样的输出:

some information Important-1  
Important-2 some information

我怎样才能修改命令,使输出看起来像这样没有额外的信息?

Important-1     Important-2

基本上,我只需要从第一行的末尾开始的n个字符,以及从第二行的开头开始的n个字符。
最好的办法是什么?

ibps3vxo

ibps3vxo1#

假设你想保留11个尾随/前导字符,你可以尝试(用GNU sed和macOS Ventura附带的sed测试):

$ sed -En '/pattern one/{n;h;};/pattern two/{n;n;n;n;n;g;N;s/.*(.{11})\n(.{11}).*/\1 \2/;p;}' file
Important-1 Important-2

当一行匹配pattern one时,我们读取下一行并复制到hold space。当一行匹配pattern two时,我们读取下5行,将hold space复制到模式空间,追加一个换行符和下一行,用11char-space-11char替换X-11char-newline-11char-Y并打印。

xghobddn

xghobddn2#

记住,sed在修改一行代码时非常强大。当你需要与前一行代码进行逻辑处理时,awk通常更好。

awk '/pattern one/ {p1=NR+1}
     /pattern two/ {p2=NR+6}
     NR==p1 {printf("%s   ",$NF)}
     NR==p2 {print $1}
    ' inputfile

如果有更多的文件,请使用类似

awk 'FNR==1 {p1=0; p2=0}
     /pattern one/ {p1=FNR+1}
     /pattern two/ {p2=FNR+6}
     FNR==p1 {printf("%s   ",$NF)}
     FNR==p2 {print $1}
    ' *

相关问题