如何使用sed仅隔离文件的第一部分

时间:2016-02-15 21:18:06

标签: sed gnu

我正在运行Windows并拥有GnuWin32工具包,其中包括sed。具体做法是:

C:\ TEMP> sed --version

GNU sed版本4.2.1

我有一个包含两个部分的文本文件:我要保留的固定部分,以及运行作业后附加的部分。

在文件中是一个唯一的字符串,用于标识添加的部分的开头,我想使用Gnu sed仅隔离在唯一字符串之前的文件部分 - 即,我可以添加不同的字符串每次运行作业时数据到固定部分。

我知道我可以将固定部分保存在一个单独的文件中,但这会增加复杂性,如果我可以在同一个文件的开头重用数据,它会更加优雅。

很久以前我知道如何设置sed脚本,我确信这可以用sed完成,但从那以后我就睡了。 :)

您能否描述如何使用sed在文件中显示文本行,但不包括特定字符串?

示例:

line 1 of fixed portion
line 2 of fixed portion
unique string
line 1 of appended portion
line 2 of appended portion
line 3 of appended portion

我想要看的是输出:

line 1 of fixed portion
line 2 of fixed portion

我已经达到了:

sed -r -n -e "0,/unique string/p"

但也打印出唯一的字符串。

提前致谢。

-Noel

1 个答案:

答案 0 :(得分:2)

这应该适合你:

sed -n '/unique string/q;p' file

退出unique string处理。打印其他行。

另一种方法可能是使用这样的范围地址:

sed -n '1,/unique string/{/unique string/!p}' file

请注意,sed包含范围边框。我们需要从打印中排除unique string

此外,我使用了-n选项,默认情况下sed会抑制输入行的输出。

有一件事,如果unique string可以包含在正则表达式中也是语法字符的字符...

test*

... sed可能不再是工作的正确工具,因为它只能匹配正则表达式而不能匹配固定字符串

在这种情况下,awk可能是首选工具:

awk 'index("*unique string*"){exit}1' file
如果找到字符串,

index("string")将返回非零值(位置)。在这种情况下,我们取消对输入行的进一步处理,也不打印该行。

尾随1始终评估为true,并使awk打印所有行,直到上一个条件适用。