以下是我脚本的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命令才能执行此操作?
答案 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"