使用sed打印匹配的行

时间:2015-07-26 05:29:26

标签: shell unix sed

stackoverflow.csv文件中的示例数据我有:

foo
foo
foo
foo
bar
bar
bar
bar
baz
baz
baz
baz

我知道sed -n /foo/p stackoverflow.csv > foo.csv

我将获得与foo相匹配的所有记录,但我不想在cli上指定匹配模式,我宁愿将其放在脚本中并拥有所有记录(foo,bar和baz)发送到他们自己的档案。

基本上这是在剧本中:

sed -n /foo/p stackoverflow.csv > foo.csv
sed -n /bar/p stackoverflow.csv > bar.csv
sed -n /baz/p stackoverflow.csv > baz.csv

像这样:

#!/bin/sh
sleep 2
sed -n /foo/p > foo.csv
sed -n /bar/p > bar.csv
sed -n /baz/p > baz.csv

这会创建文件,但它们全部为空。 此外,如果脚本只有一个print语句,它就可以工作。

任何输入?

3 个答案:

答案 0 :(得分:3)

您错过了输入文件名

#!/bin/sh
sleep 2
sed -n /foo/p stackoverflow.csv > foo.csv
sed -n /bar/p stackoverflow.csv > bar.csv
sed -n /baz/p stackoverflow.csv > baz.csv

您可以将输入文件作为参数提供给脚本,在这种情况下,请更改脚本以读取参数并将其传递给sed命令。 像这样运行脚本:./script.sh input_filename,您可以在其中指定不同的输入文件作为参数。

#!/bin/sh

file=${1}

sed -n /foo/p ${file} > foo.csv
sed -n /bar/p ${file} > bar.csv
sed -n /baz/p ${file} > baz.csv

答案 1 :(得分:1)

w中的sed命令允许您写入命名文件。

sed -n -e '/foo/wfoo.csv' -e '/bar/wbar.csv' \
    -e '/baz/wbaz.csv' stackoverflow.csv

并非所有sed方言都接受多个-e个参数;由换行符分隔的命令的多行字符串可能是最便携的解决方案。

sed -n '/foo/wfoo.csv
    /bar/wbar.csv
    /baz/wbaz.csv' stackoverflow.csv

这只会检查一次输入文件,并在文件继续写出匹配的行。

要创建一个接受一个或多个文件名作为参数的脚本,请将硬编码的文件名替换为"$@"

#!/bin/sh
sed -n ... "$@"

答案 2 :(得分:0)

这是一个在循环中使用grep的解决方案,您不需要提前提供每个术语。假设有一个bash shell:

for i in $(sort stackoverflow.csv | uniq); do grep $i testfile > $i; done