Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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
Xml 如何使长SED脚本更精简,更易于作为代码阅读_Xml_Database_Bash_Sed_Mediainfo - Fatal编程技术网

Xml 如何使长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部分:

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