我试图找到一种方法来删除在标记字符串之前在我的asciidoc文件中找到的空行,例如:
//Empty line
[source,shell]
我需要:
[source,shell]
我正在尝试:
sed '/^\s*$\n[source,shell]/d' file
然而,它并没有产生预期的效果(甚至逃避括号)。有什么帮助吗?
答案 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
工作原理:匹配空行时,将下一行读入模式空间,如果找到标记,则删除空行。 请注意,如果在标记之前有两个空行,这将无法正常工作,因为第一个空行将消耗第二个空行并且不会与标记匹配。