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

How to use sed to isolate only the first part of a file

我 运行宁 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"

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

提前致谢。

-诺尔

这应该适合你:

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") returns 如果已找到字符串,则为非零值(位置)。在这种情况下,我们取消对输入行的进一步处理,也不打印该行。

尾随 1 的计算结果始终为真,并使 awk 打印所有行,直到前一个条件适用。