如何使长SED脚本更精简,更可读作为代码

时间:2015-08-22 20:42:00

标签: xml database bash sed mediainfo

以下是我脚本的sed部分:

sed -i -e 's/<Codec>/<inm:Video-codec>/g;s/<Duration_String4>/<inm:D-Duration>/g;s/<Width>/<inm:Width>/g;s/<\/Codec>/<\/inm:Video-codec>/g;s/<\/Duration_String4>/<\/inm:D-Duration>/g;s/<\/Width>/<\/inm:Width>/g;s/<FileExtension>/<inm:Wrapper>/g;s/<\/FileExtension>/<\/inm:Wrapper>/g' "$1"

它只会变得越来越长。有没有办法让这个代码更具可读性?我可以为每次更换添加一个新行,还是必须启动一个新的sed命令才能执行此操作?

3 个答案:

答案 0 :(得分:1)

首先在部分中设置sedstring:

SEDSTR='s/<Codec>/<inm:Video-codec>/g'
SEDSTR="$SEDSTR;"'s/<Duration_String4>/<inm:D-Duration>/g'
SEDSTR="$SEDSTR;"'s/<Width>/<inm:Width>/g'
SEDSTR="$SEDSTR;"'s/<\/Codec>/<\/inm:Video-codec>/g'
SEDSTR="$SEDSTR;"'s/<\/Duration_String4>/<\/inm:D-Duration>/g'
SEDSTR="$SEDSTR;"'s/<\/Width>/<\/inm:Width>/g'
SEDSTR="$SEDSTR;"'s/<FileExtension>/<inm:Wrapper>/g'
SEDSTR="$SEDSTR;"'s/<\/FileExtension>/<\/inm:Wrapper>/g'

sed -i -e "$SEDSTR" "$1"

编辑1:备注:使用小写的shell变量更好。 编辑2:可以使用+=

完成追加
sedstr='s/<Codec>/<inm:Video-codec>/g'
sedstr+=';s/<Duration_String4>/<inm:D-Duration>/g'
sedstr+=';s/<Width>/<inm:Width>/g'
sedstr+=';s/<\/Codec>/<\/inm:Video-codec>/g'
sedstr+=';s/<\/Duration_String4>/<\/inm:D-Duration>/g'
sedstr+=';s/<\/Width>/<\/inm:Width>/g'
sedstr+=';s/<FileExtension>/<inm:Wrapper>/g'
sedstr+=';s/<\/FileExtension>/<\/inm:Wrapper>/g'

sed -i -e "${sedstr}" "$1"

您的下一步可能是创建一个解析配置文件的函数 配置文件可以有像

这样的行
<Codec>*<inm:Video-codec>
</Codec>*</inm:Video-codec>

(带*一个漂亮的FieldSep)并让你的函数处理反斜杠。

甚至更好:告诉你的功能应该总是添加一个结束标签替换, 并制作一个像

这样的配置文件
Codec/inm:Video-codec
Duration_String4/inm:D-Duration
Width/inm:Width
FileExtension/inm:Wrapper

答案 1 :(得分:0)

看看this question说明

sed 's'/\
'[long1]'\
'[long2]'\
'/'\
'[long3]'\
'[long4]'\
'/' file.txt

&#34;如果没有缩进新行,则在带有反斜杠的几行上拆分会有效。&#34;

答案 2 :(得分:0)

您可以多次指定-e

sed -i -e 's/<Codec>/<inm:Video-codec>/g' \
       -e 's/<Duration_String4>/<inm:D-Duration>/g' \
       -e 's/<Width>/<inm:Width>/g' \
       -e 's/<\/Codec>/<\/inm:Video-codec>/g' \
       -e 's/<\/Duration_String4>/<\/inm:D-Duration>/g' \
       -e 's/<\/Width>/<\/inm:Width>/g' \
       -e 's/<FileExtension>/<inm:Wrapper>/g' \
       -e 's/<\/FileExtension>/<\/inm:Wrapper>/g' "$1"

可能导致您使用bash数组重构:

commands=(
       's/<Codec>/<inm:Video-codec>/g'
       's/<Duration_String4>/<inm:D-Duration>/g'
       's/<Width>/<inm:Width>/g'
       's/<\/Codec>/<\/inm:Video-codec>/g'
       's/<\/Duration_String4>/<\/inm:D-Duration>/g'
       's/<\/Width>/<\/inm:Width>/g'
       's/<FileExtension>/<inm:Wrapper>/g'
       's/<\/FileExtension>/<\/inm:Wrapper>/g'
)

for cmd in "${commands[@]}"; do
    options+=(-e "$cmd")
done

sed "${options[@]}" "$1"

或者,使用-f选项和流程替换:

sed -f <( printf "%s\n" "${commands[@]}" ) "$1"