在看到了Gilles的perl和awk紧凑示例之后,我不愿发布此示例,但是我已经完成了练习,并且它是一个有效的脚本,已被合理地记录在案。这一点可能对某些人来说很有趣..(附评论!:)
该脚本认为空白行即使包含空格也为空白。
文本中的多个空格被压缩为一个空格。
尾随空格从文本行中删除。连续的空行折叠为单行。该脚本使顶部和底部空白行保持不变。
除了最简单的脚本外,sed可以作为一个单独的脚本文件以结构化形式轻松编写。这是一个例子。
使用扩展的正则表达式语法
调用:$ sed -rf脚本文本文件
:first-empty-line
#================
/^[[:space:]]*$/ { # if pattern-space is empty...
$q # last line # flush-quit
n # pattern-flush=nextline-continue
:subsequent-empty-line
#=====================
/^[[:space:]]*$/ { # if pattern-space is empty...
$d # last line # pattern-delete-cycle
N # pattern+=nl+nextline
s/.*\n// # scrap the leading 'blank' line
t subsequent-empty-line # branch-on-substitute
}
}
:text-line
#=========
$q # last line # flush-quit
s/^(.*)[[:space:]]*/\1/ # trim trailing whitespace
s/ +/ /g # condense mulltiple spaces
N # pattern+=nl+nextline
/^.*\n[[:space:]]*$/ { # if newly-read line is blank
P # pattern-first-line-print
s/^.*\n// # remove the leading 'text' line
t first-empty-line # branch-on-substitute
}
# read line is text
s/\n/ / # replace \n with a space
t text-line # branch-on-substitute
注意:flush
在注释中,意味着:将模式空间发送到sed的内部stdout处理。这并不意味着一定要打印到stdout。输出取决于sed的-n
选项。例如。该q
命令表示刷新并退出 ...比较这两个代码段:echo x |sed -e q
打印x,不echo x |sed -ne q
打印任何内容,而使用该p
命令则将两次打印'x'一次,具体取决于-n
选项。