sed搜索行并删除以下十行的第一个字符

时间:2016-07-11 14:25:12

标签: bash awk sed

我有一个包含链接的文件。这些链接被注释掉了。我想使用sed或awk搜索特定的字符串,然后删除以下十行的第一个字符。

据我所知,我可以用以下方式搜索sed

sed -n '/StringToSearchFor/p' file

使用awk我会写下面的

awk '/pattern/ {print $1}'

但我怎么能删除以下十行的第一个字符?

sed和awk的手册页是一个巨大的。所以请不要指着他们旁边你有一个搜索字符串。

提前致谢。

5 个答案:

答案 0 :(得分:0)

Perl救援:

perl -pe 's/^.// if $l > 0 && $l--; $l = 10 if /StringToSearchFor/'
  • $l保留删除第一个字符的行数。每次遇到搜索模式时都会设置为10。
  • 如果仍有行要删除($l > 0)中的第一个字符,则会将其删除并减少行数($l--)。
  • s/^.//只删除第一个字符。使用substr $_, 0, 1, q()可能会更快。

答案 1 :(得分:0)

你可以使用这个awk:

awk -v s='StringToSearchFor' '$0 ~ s{n=NR} NR<=n+10{$0 = substr($0, 2)} 1' file

答案 2 :(得分:0)

试试这个。

awk '/pattern/ { p=11 }
    p && p-- <= 10 { print substr($0, 2); next }
    1'

当我们看到模式时,我们设置p。当设置p但是更小时,即在后面的十行上,我们打印一个子串;否则,1是打印所有其他行的简写。 next导致Awk与下一个输入行一起开始。

答案 3 :(得分:0)

下面有一个沉重的sed版本。它打印匹配模式的行和后面的10行没有它们的第一个char,并退出:

sed -n '/StringToSearchFor/{p;n;s/^.\(.*\)$/\1/p;n;s/^.\(.*\)$/\1/p;n;s/^.\(.*\)$/\1/p;n;s/^.\(.*\)$/\1/p;n;s/^.\(.*\)$/\1/p;n;s/^.\(.*\)$/\1/p;n;s/^.\(.*\)$/\1/p;n;s/^.\(.*\)$/\1/p;n;s/^.\(.*\)$/\1/p;n;s/^.\(.*\)$/\1/p;q}' java0.log

/StringToSearchFor/{ ... }:定义当前行与正则表达式匹配时要执行的命令块。

sed命令是字母:

  • p:打印当前行(模式空间)
  • nsed -n:清空模式空间并在下一行中读取
  • s/^.\(.*\)$/\1/p:打印除第一个之外的所有字符。
  • q:退出

使用10次n;s/^.\(.*\)$/\1/p:打印10行而不使用第一个字符。

答案 4 :(得分:0)

另一个awk

awk 'p&&p--{sub(/^./,"")} /pattern/{p=10} 1' file

删除模式后面的10行的第一个字符。

相关问题