删除空行后跟一个模式

时间:2017-02-14 16:05:44

标签: bash


我试图找到一种方法来删除在标记字符串之前在我的asciidoc文件中找到的空行,例如:

//Empty line
[source,shell]

我需要:

[source,shell]

我正在尝试:

sed '/^\s*$\n[source,shell]/d' file
然而,它并没有产生预期的效果(甚至逃避括号)。有什么帮助吗?

2 个答案:

答案 0 :(得分:1)

您可以使用此 awk-script 删除以前的空行:

awk -v desired_val="[source,shell]" 
'BEGIN { first_time=1 }
 { 
   if ( $0 != desired_val && first_time != 1) { print prev };
   prev = $0;
   first_time = 0;
 }
 END { print $0 }' your_file

下一个脚本比前一个脚本稍微多一点,但提供了在所需值之前删除所有空行。

# AWK script file
# Provides clearing all empty lines in front of desired value 
# Usage: awk -v DESIRED_VAL="your_value" -f "awk_script_fname" input_fname

BEGIN { i=0 }
{ 
  # If line is empty - save counts of empty strings
  if ( length($0) == 0 ) { i++; }

  # If line is not empty and is DESIRED_VAL, print it  
  if ( length ($0) != 0 && $0 == DESIRED_VAL )
  {
    print $0; i=0;
  }

  # If line is not empty and not DESIRED_VAL, print all empty str and current
  if ( length ($0) != 0 && $0 != DESIRED_VAL )
  {   
    for (m=0;m<i;m++) { print ""; } i=0; print $0;
  }
}

# If last lines is empty, print it
END { for (m=0;m<i;m++) { print ""; } }

这是输入以下命令使用的awk脚本:

awk -v DESIRED_VAL="your_value" -f "awk_script_fname" input_fname

答案 1 :(得分:0)

您的sed行不起作用,因为sed一次处理一行,因此除非您操作模式空间,否则它将与包含\n的模式不匹配。

如果您仍想使用sed:

sed '/^$/{N;s/\n\(\[source,shell]\)/\1/}' file

工作原理:匹配空行时,将下一行读入模式空间,如果找到标记,则删除空行。 请注意,如果在标记之前有两个空行,这将无法正常工作,因为第一个空行将消耗第二个空行并且不会与标记匹配。