1

私は次のファイルを持っています:

<CamcorderProfiles cameraId="0">

    <EncoderProfile quality="720p" fileFormat="mp4" duration="30">
        <Video codec="h264"
               bitRate="8000000"
               width="1280"
               height="720"
               frameRate="30" />
        <Audio codec="aac"
               bitRate="96000"
               sampleRate="48000"
               channels="1" />
    </EncoderProfile>

    <EncoderProfile quality="1080p" fileFormat="mp4" duration="30">
        <Video codec="h264"
               bitRate="12000000"
               width="1920"
               height="1080"
               frameRate="30" />
        <Audio codec="aac"
               bitRate="96000"
               sampleRate="48000"
               channels="1" />
    </EncoderProfile>

</CamcorderProfiles>

<CamcorderProfiles cameraId="1">

    <EncoderProfile quality="720p" fileFormat="mp4" duration="30">
        <Video codec="h264"
               bitRate="8000000"
               width="1280"
               height="720"
               frameRate="30" />
        <Audio codec="aac"
               bitRate="96000"
               sampleRate="48000"
               channels="1" />
    </EncoderProfile>

    <EncoderProfile quality="1080p" fileFormat="mp4" duration="30">
        <Video codec="h264"
               bitRate="12000000"
               width="1920"
               height="1080"
               frameRate="30" />
        <Audio codec="aac"
               bitRate="96000"
               sampleRate="48000"
               channels="1" />
    </EncoderProfile>

</CamcorderProfiles>

これが私のコードです:

camerastart=$(sed -n '{/<CamcorderProfiles cameraId="0">/=}' $file)
cameraend=$(sed -n $camerastart',$ {/<\/CamcorderProfiles>/=}' $file)

camera1080pstart=$(sed -n $camerastart','$cameraend' {/<EncoderProfile quality="1080p" fileFormat="mp4" duration="30">/=}' $file)

変数を出力すると、camera1080p_startを除くすべてで正しい行番号が取得され、空白になります。

camerastart = 3
cameraend = 29
camera1080pstart = 

コードの最初の行をに変更すると、cameraId="1"その場合に適切な結果が得られます。

camerastart = 31
cameraend = 57
camera1080pstart = 45

最初の2つの変数がハードコードされるようにコードを変更すると、camera1080pstartの適切な出力が得られます17

camerastart="3"
cameraend="29"

camera1080pstart=$(sed -n $camerastart','$cameraend' {/<EncoderProfile quality="1080p" fileFormat="mp4" duration="30">/=}' $file)

誰が何が起こっているのか知っていますか?

4

3 に答える 3

1

2 番目のコマンドを次のように変更します。

cameraend=$(sed -n $camerastart',$ {/<\/CamcorderProfiles>/=}' $file | head -1)

複数の行番号を返すためです。ただし、これは、この特定の問題に取り組む最善の方法ではない可能性があります。

于 2013-01-06T04:15:59.467 に答える
0

変更したい行を見つけて出力するスクリプトは次のとおりです。

$ 猫 tst.awk

BEGIN{ FS = "\"" }
/<CamcorderProfiles cameraId=/ { cameraId = $2 }
/<EncoderProfile quality=/     { quality  = $2 }
/bitRate="12000000"/ {
   if ( (cameraId == "0") && (quality == "1080p") ) {
      print NR, "this is the line I want to change:"
      print
   }
}
$ awk -f tst.awk file
17 this is the line I want to change:
               bitRate="12000000"

別の cameraId および/または品質および/またはその他の値で呼び出すことができるようにする必要がある場合、それは簡単な調整です。

スクリプトが見つけた行をどのように変更したいかを教えていただければ、それも些細なことです。

編集: 以下の OP コメントに基づいてスクリプトを更新しました。

$ cat tst.awk
BEGIN{ FS = "\"" }
/<CamcorderProfiles cameraId=/ { cameraId = $2 }
/<EncoderProfile quality=/     { quality  = $2 }
/bitRate="12000000"/ {
   if ( (cameraId == "0") && (quality == "1080p") ) {
      sub(/12000000/,"20000000")
   }
}
{ print }

$ awk -f tst.awk file > tmpfile

$ diff file tmpfile
17c17
<                bitRate="12000000"
---
>                bitRate="20000000"

元のファイルを更新する場合は、次のように実行します。

awk -f tst.awk file > tmpfile && mv tmpfile file
于 2013-01-06T01:08:09.840 に答える
0

私のために働いた解決策は次のとおりです。

camerastart=$(sed -n '{/<CamcorderProfiles cameraId="0">/=}' $file | head -1)
cameraend=$(sed -n $camerastart',$ {/<\/CamcorderProfiles>/=}' $file | head -1)

camera1080pstart=$(sed -n $camerastart','$cameraend' {/<EncoderProfile quality="1080p" fileFormat="mp4" duration="30">/=}' $file | head -1)
于 2013-01-07T23:14:29.070 に答える