1

I have cert.enc file as below.it has multiple lines

MIIPZAIBAzCCDx4GCSqGSIb3DQEHAaCCDw8Egg8LMIIPBzCCBZQGCSqGSIb3DQEH
AaCCBYUEggWBMIIFfTCCBXkGCyqGSIb3DQEMCgECoIIE+jCCBPYwKAYKKoZIhvcN
AQwBAzAaBBTQnaS1AE0gnwlbnfZsLfdzGxXnTAICBAAEggTIhChZpcY/STZNt1kl
1WzBoq5OI+QaFBJFA9nimyMaB3cywcL8ohKbuhHpUzc7jWvfw4iA/V9JDVkW3FHs
CQRQDCYWwzcbm43vkL61+zba133ZaGV4AVMj/RYYwA2lgFAG2/+gKi7ByrdaYiuH
dWSI/Aid+ZNsnO4rx8/BkHAnmKZ+B71bD+Rod4pVGOmW/vwI6lHnYfospcptc3aP
eKa6S1UoK1QHDOplkp1HFZhkiBXxnhIKpbpvvzH0ZoFSiUPlc9ycFZcS3VC1kxM1
AHmqlqecSP+p+FiksnkppCS49quSyoU2IPatkVJTDKpnehLIXj1UIwKCkIcTR6np
1JkQeJXzvIH1yo7IVyUuTVUb2kx3U/OXveeyoRFaODQlt4WNY2Z7cUR+Ub+A/ECv
0hKEIU/HD+g+S93di4n3q5o0w0mHNPXITkHHNgpDW+lS3kHm3IV+8gchP99r//Xx

Here is my XML file.cat test.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>PayloadContent</key>
        <array>
                <dict>
                        <key>Password</key>
                        <string>P@ssw0rd</string>
                        <key>PayloadCertificateFileName</key>
                        <string>tin.user_11:22:33:44:55:66.p12</string>
                        <key>PayloadContent</key>
                        <data>
                        **PRIVATEKEY**
                        </data>
                        <key>PayloadDescription</key>
                        <string>Adds a PKCS#12-formatted certificate</string>
                        <key>PayloadDisplayName</key>
                        <string>tin.user_11:22:33:44:55:66.p12</string>
                        <key>PayloadIdentifier</key>
                        <string>com.apple.security.pkcsAF0F-4BFB-A054-FB31E99420A2</string>
                        <key>PayloadType</key>
                        <string>com.apple.security.pkcs12</string>
                        <key>PayloadUUID</key>
                        <string>AF0F-4BFB-A054-FB31E99420A2</string>
                        <key>PayloadVersion</key>
                        <integer>1</integer>
                </dict>

My question is how to replace the output from cat cert.enc in PRIVATEKEY using the same position [indent] between <data> and </data>

The below command works

sed  '/PRIVATEKEY/r cert.enc' test.xml |sed '/PRIVATEKEY/d'

but the key was placed in the left margin. Not the same like <data> position.

  • [Don't Parse XML/HTML With Regex.](https://stackoverflow.com/a/1732454/3776858) I suggest to use an XML/HTML parser (xmlstarlet, xmllint ...). – Cyrus Jul 21 '18 at 05:24
  • Do you **really** want to indent your key and change its content? – Cyrus Jul 21 '18 at 05:59

2 Answers2

1
key="$(cat cert.enc)"
xmlstarlet edit --update '//data' --value "$key" test.xml

Output:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>PayloadContent</key>
    <array>
      <dict>
        <key>Password</key>
        <string>P@ssw0rd</string>
        <key>PayloadCertificateFileName</key>
        <string>tin.user_11:22:33:44:55:66.p12</string>
        <key>PayloadContent</key>
        <data>MIIPZAIBAzCCDx4GCSqGSIb3DQEHAaCCDw8Egg8LMIIPBzCCBZQGCSqGSIb3DQEH
AaCCBYUEggWBMIIFfTCCBXkGCyqGSIb3DQEMCgECoIIE+jCCBPYwKAYKKoZIhvcN
AQwBAzAaBBTQnaS1AE0gnwlbnfZsLfdzGxXnTAICBAAEggTIhChZpcY/STZNt1kl
1WzBoq5OI+QaFBJFA9nimyMaB3cywcL8ohKbuhHpUzc7jWvfw4iA/V9JDVkW3FHs
CQRQDCYWwzcbm43vkL61+zba133ZaGV4AVMj/RYYwA2lgFAG2/+gKi7ByrdaYiuH
dWSI/Aid+ZNsnO4rx8/BkHAnmKZ+B71bD+Rod4pVGOmW/vwI6lHnYfospcptc3aP
eKa6S1UoK1QHDOplkp1HFZhkiBXxnhIKpbpvvzH0ZoFSiUPlc9ycFZcS3VC1kxM1
AHmqlqecSP+p+FiksnkppCS49quSyoU2IPatkVJTDKpnehLIXj1UIwKCkIcTR6np
1JkQeJXzvIH1yo7IVyUuTVUb2kx3U/OXveeyoRFaODQlt4WNY2Z7cUR+Ub+A/ECv
0hKEIU/HD+g+S93di4n3q5o0w0mHNPXITkHHNgpDW+lS3kHm3IV+8gchP99r//Xx</data>
        <key>PayloadDescription</key>
        <string>Adds a PKCS#12-formatted certificate</string>
        <key>PayloadDisplayName</key>
        <string>tin.user_11:22:33:44:55:66.p12</string>
        <key>PayloadIdentifier</key>
        <string>com.apple.security.pkcsAF0F-4BFB-A054-FB31E99420A2</string>
        <key>PayloadType</key>
        <string>com.apple.security.pkcs12</string>
        <key>PayloadUUID</key>
        <string>AF0F-4BFB-A054-FB31E99420A2</string>
        <key>PayloadVersion</key>
        <integer>1</integer>
      </dict>
    </array>
  </dict>
</plist>

If you want to edit file inplace, add option -L.

Cyrus
  • 84,225
  • 14
  • 89
  • 153
0

This might work for you (GNU sed):

 sed '/\*\*PRIVATEKEY\*\*/r keyFile' file |
 sed -r '/\*\*PRIVATEKEY\*\*/{h;d};/^\S+{64}$/{G;s/(.*)\n(\s*).*/\2\1/}'

This uses the same method you stated above but instead of just deleting the PRIVATEKEY we make a copy then delete it and append the copy to each line of the key. Then using pattern matching the indent is moved in front of the key.

An alternative:

sed -e '/\*\*PRIVATEKEY\*\*/r keyFile' -e '//d' file |
sed '/<data>/h;//,/<\/data/{//b;G;s/\(.*\)\n\(\s*\).*/\2\1/}' 

Rather than relying on the length of key, uses the data tags range to amend the indentation.

potong
  • 55,640
  • 6
  • 51
  • 83