Xml 如何使长SED脚本更精简,更易于作为代码阅读
以下是我现在脚本的sed部分:Xml 如何使长SED脚本更精简,更易于作为代码阅读,xml,database,bash,sed,mediainfo,Xml,Database,Bash,Sed,Mediainfo,以下是我现在脚本的sed部分: sed-i-e的///g;s///g;s///g;s///g;s///g;s///g;s///g;s///g''1' 它只会越来越长。有没有办法让这段代码更具可读性?我可以为每次更换都换一行吗,或者我必须启动一个新的sed命令才能做到这一点吗?请看一下这一点 sed 's'/\ '[long1]'\ '[long2]'\ '/'\ '[long3]'\ '[long4]'\ '/' file.txt “如果新行没有缩进,使用反斜杠拆分几行是可行的。”以下是GNU
sed-i-e的///g;s///g;s///g;s///g;s///g;s///g;s///g;s///g''1'
它只会越来越长。有没有办法让这段代码更具可读性?我可以为每次更换都换一行吗,或者我必须启动一个新的sed命令才能做到这一点吗?请看一下这一点
sed 's'/\
'[long1]'\
'[long2]'\
'/'\
'[long3]'\
'[long4]'\
'/' file.txt
“如果新行没有缩进,使用反斜杠拆分几行是可行的。”以下是GNU awk的等效值:
awk -i inplace '{
$0 = gensub(/<(\/?Codec>/,"<\\1inm:Video-codec>")
$0 = gensub(/<(\/?)Duration_String4>","<\\1inm:D-Duration>")
$0 = gensub(/<(\/?)Width>","<\\1inm:Width>")
$0 = gensub(/<(\/?)FileExtension>","<\\1inm:Wrapper>")
print
}' "$1"
awk-i就地'{
$0=gensub(/,“”)
$0=gensub(/“,”)
$0=gensub(/“,”)
$0=gensub(/“,”)
打印
}' "$1"
您可以多次指定-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"
或者,使用-f
选项和过程替换:
sed -f <( printf "%s\n" "${commands[@]}" ) "$1"
sed-f首先分部分设置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"
您的下一步可能是创建一个解析配置文件的函数。
configfile可以有如下行
<Codec>*<inm:Video-codec>
</Codec>*</inm:Video-codec>
使用XML解析器或查看sed的选项-f
。谢谢。我在过去几天才开始使用这些脚本。我想你是对的。xmlstarlet看起来可以满足我的需要,但sed在短期内对我来说效果很好。我喜欢它的外观,非常整洁。我将代码直接复制并粘贴到.sh文件中,然后刚刚在顶部添加了#!/bin/bash。我得到了以下错误awk:unknown选项-我忽略了awk:not open file{$0=gensub(/,“”)$0=gensub(/,“”)$0=gensub(/,“”)$0=gensub(/,“”)print}源代码行编号1
,正如我所说,它使用了gawk。您显然没有使用gawk(或者可能正在使用非常旧的版本)。现在看看。我认为您的第一个使用multiple-e的示例看起来很棒。但这对我不起作用。我用阿巴斯·谢邦(abash shebang)在顶部运行了你的脚本。我收到以下错误:sed:-e:没有这样的文件或目录
@Tandy:请检查每行最后一个\之后没有空格。您需要在不同选项之间留空格。请注意options+=“-e'$cmd'”
中最后一个单引号和双引号之间的空格。到目前为止,您的第一个SEDSTR示例是唯一一个工作完美的答案,它看起来非常干净,可以让我的生活更轻松。我不明白你的其他建议,但我真的很感谢你发布它们。当我对bash感到更舒服时,我会研究它们。我将暂缓选择一个正确的答案,以防其他一些海报收到我的评论。另外,你能解释一下SEDSTRING发生了什么吗?我在谷歌上看不到太多。这仅仅是您正在创建的一个变量吗?你怎么不做=“$SEDSTR;对于第一行?顺便说一句:a=abc;a+=123;echo$a
@Tandy SEDSTR是我们在这里使用的变量的随机名称。我应该收到这样的评论,即shell变量使用小写更为简洁,因此它不会恰好与内部变量相同。第一行只是给它赋值。接下来的几行将通过将其添加到var的值中来附加值(使用$请求值,而不指定值)。当你想继续我的例子时,你会发现关于函数的一些东西,并了解我应该用local sedstr='s///g'
制作一个本地变量。将来:您可以从配置文件中读取oldtag和newtag,生成s///g
和s///code>字符串并将它们附加到sedstr。
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>
Codec/inm:Video-codec
Duration_String4/inm:D-Duration
Width/inm:Width
FileExtension/inm:Wrapper