【发布时间】:2011-01-08 14:36:24
【问题描述】:
我有一个包含很多字的文件,例如:
one
two
three
four
tree
house
cat
dog
etc
我想删除“house”之前的所有单词,以便仅获取:
cat
dog
etc
【问题讨论】:
标签: bash shell unix scripting filter
我有一个包含很多字的文件,例如:
one
two
three
four
tree
house
cat
dog
etc
我想删除“house”之前的所有单词,以便仅获取:
cat
dog
etc
【问题讨论】:
标签: bash shell unix scripting filter
sed -n '0,/^house$/d;p' input.txt
【讨论】:
sed 支持 0 作为地址,但其他不支持。 0,/regex/ 和1,/regex/ 的区别在于,如果正则表达式匹配第一行,0 形式将结束范围,而 1 形式将等到正则表达式的下一次匹配结束范围。
sed '0,/^house$/d' input.txt 有何不同?也就是说,为什么-n 和;p ?
您可以使用 Perl 单行代码轻松完成此操作,当然您也可以将其合并到 bash 脚本中。
$ perl -ne 'print if $ok; $ok=1 if /^house$/' sample.txt
cat
dog
etc
【讨论】:
awk '
BEGIN { noprint = 1; cue = ARGV[1]; ARGV[1] = ""}
(!noprint) { print }
(noprint && $0 == cue) { noprint = 0 }
' house textfile
【讨论】:
gawk 3.1.5。
您也可以使用 Unix 文本编辑器来完成此类任务。请注意,ed 会将整个文件读入内存并在没有先前备份的情况下就地编辑文件。
# prints result to stdout
printf '%s\n' H ',g/^house$/1,/^house$/d' ',p' | ed -s file
printf '%s\n' H ',g/^house$/1,//d' ',p' | ed -s file # short version
# edits file in-place
printf '%s\n' H ',g/^house$/1,/^house$/d' wq | ed -s file
更多关于ed的信息请看:
"使用 ed 文本编辑器从脚本编辑文件",
【讨论】: