Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.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
Bash 如何将sed语句(带引号)保存在变量中以供多次调用_Bash_Sed_Escaping_Quoting - Fatal编程技术网

Bash 如何将sed语句(带引号)保存在变量中以供多次调用

Bash 如何将sed语句(带引号)保存在变量中以供多次调用,bash,sed,escaping,quoting,Bash,Sed,Escaping,Quoting,我使用以下管道对一些文本进行后处理: sed 's/error/ /g' | sed 's/\+/ /g' | tail -n +6 | ghead -n -1 我需要多次使用这个管道,所以我想将所有这些都保存在一个变量中,以便以后可以轻松调用它。我尝试了几种不同的方法来保存引号(单引号、双引号、转义引号等),例如: cleanup='sed '"'"'s/error/ /g'"'"' | sed '"'"'s/\+/ /g'"'"' | tail -n +6 | ghead

我使用以下管道对一些文本进行后处理:

sed 's/error/     /g' | sed 's/\+/ /g' | tail -n +6 | ghead -n -1
我需要多次使用这个管道,所以我想将所有这些都保存在一个变量中,以便以后可以轻松调用它。我尝试了几种不同的方法来保存引号(单引号、双引号、转义引号等),例如:

cleanup='sed '"'"'s/error/     /g'"'"' | sed '"'"'s/\+/ /g'"'"' | tail -n +6 | ghead -n -1'
然而,到目前为止,我还没有找到神奇的组合

编辑====


显然,我真正的问题是我没有使用
eval
。但是,我仍然对比我更优雅的方法感兴趣。

如果清除是一个函数,而不是字符串,它会起作用:

cleanup() { sed 's/error/     /g' | sed 's/\+/ /g' | tail -n +6 | ghead -n -1; }
例如:

$ seq 8 | cleanup
6
7
简化 看起来管道可以简化。如果我不熟悉的
ghead
,与通常的
head
相同,请尝试:

cleanup() { sed '1,5d; $d; s/error/     /g; s/\+/ /g'; }
这项工作如下:

  • 1,5 d
    删除第1行到第5行。这将替换
    尾部-n+6

  • $d
    删除最后一行。这将替换
    头-n-1

  • 这两个替代命令保持不变,但被合并到sed的单一调用中

非GNU sed(BSD、Mac OSX) 以上内容在GNU sed上进行了测试。NeronLeVelu报告说,其他sed版本可能在delete命令后需要换行符。在这种情况下,使用bash的
$'…'
功能,尝试:

cleanup() { sed $'1,5d\n $d\n s/error/     /g; s/\+/ /g'; }
或者,试试:

cleanup() { sed -e '1,5d' -e '$d' -e's/error/     /g' -e 's/\+/ /g'; }

仅用双引号将整个命令括起来就可以了,要执行存储的变量,请使用eval:

cleanup="sed 's/error/ /g' | sed 's/\+/ /g' | tail -n +6 | ghead -n -1"
eval $cleanup

通常在bash中,不需要在双引号字符串中转义单引号,反之亦然。

您可以这样做:

cleanup="`cat << EOF
sed 's/error/     /g' | sed 's/\+/ /g' | tail -n +6 | ghead -n -1
EOF`"

我得到
sed:1:“'s/error/”:无效的命令代码”
。没有关系!!我错过了
评估
,这似乎一直是我的问题:(立即很好地使用sed。在posix的情况下,每行只需执行1个
d
操作(在大多数情况下,在
d
之后,该行上的以下指令将被忽略)@NeronLeVelu感谢您提供的信息!我在回答中添加了这一点。我也有报告称,将字符串分隔为
-e命令
满足BSD sed要求。(如果我能访问这样一个平台,我会自己尝试,但我没有。)
seq 8 | eval $cleanup