对于家庭作业,我正在尝试编写一个sed脚本,删除以Today
开头的行
我使用vim创建.sed文件(q1.sed
是它的名称),这是我在脚本中使用的命令:
$ sed -n '/^Today/ d' filename
我的导师说他将使用示例.txt文件来使用此命令,这就是他要求我们尝试从目录中运行脚本的方式:
$ sed -f q1.sed samplefile.txt
当它生成输出时,仍会显示包含“今天”的行。我做错了什么? (这是我从目录中的命令执行或未执行的操作,还是我从vim执行的命令?)
答案 0 :(得分:3)
答案 1 :(得分:1)
我对-n
选项并不是特别熟悉,但使用-e
选项可以正常使用:
Glastonbury:~ dhoelzer$ cat test.txt
Today is a test
this is a test
this is Not a Today test.
Glastonbury:~ dhoelzer$ sed -e '/^Today/d' test.txt
this is a test
this is Not a Today test.
要使用sed文件执行此操作,只需将该表达式粘贴到文本文件中:
/^Today/d
sed -f sendfile test.txt
我无法确定,但看起来你在问题中有一些额外的空白,这可能是你问题的根源。
答案 2 :(得分:1)
除了将脚本放入文件的问题之外,还有命令行版本
sed -n '/^Today/ d' filename
根本不会打印任何内容,因为-n
选项会阻止打印。如果你想使用-n
,你必须颠倒逻辑:
sed -n '/^Today/p' filename
在“执行打印行不以'今天'开头。
运行sed有三种主要方式:
从命令行(或从shell脚本中),如上所述
作为提供给sed的-f
选项的脚本(这是教师想要的)。该文件仅包含sed命令,在本例中只包含一个:
/^Today/d
作为独立的可执行文件:如果您的脚本看起来像
#!/bin/sed -f
/^Today/d
您可以直接使用
运行它./sedscr.sed infile
/bin/sed
必须指向您的sed可执行文件。
你所做的是将命令 sed -n '/^Today/ d' filename
提供给sed。如果你在命令行上这样做,sed会抱怨;如果你在提供给sed -f
的脚本中执行此操作,则sed会忽略违规行。
答案 3 :(得分:1)