我正在运行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
答案 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
打印所有行,直到上一个条件适用。