Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 使用sed打印匹配行_Shell_Unix_Sed - Fatal编程技术网

Shell 使用sed打印匹配行

Shell 使用sed打印匹配行,shell,unix,sed,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

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语句,那么它也可以工作


有输入吗?

您没有输入文件名

#!/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

您没有输入文件名

#!/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

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

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

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

for i in $(sort stackoverflow.csv | uniq); do grep $i testfile > $i; done
sed中的w命令允许您写入命名文件

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
这将只检查输入文件一次,并在文件中继续时写出匹配的行

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

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

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
这将只检查输入文件一次,并在文件中继续时写出匹配的行

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


我不能执行sh print.sh