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行。这将替换1,5 d
尾部-n+6
删除最后一行。这将替换$d
头-n-1
- 这两个替代命令保持不变,但被合并到sed的单一调用中
$'…'
功能,尝试:
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