Sed:删除与模式匹配的所有内容


1

我在Mac OS X上有一些plist文件,我想缩小。他们有很多<dict><key>和值。其中一个键是一个缩略图,其<data>值为base64编码二进制(我认为)。我想删除此密钥和值。

我认为这可能是由sed完成的,但我真的不知道如何使用它,似乎sed只能在逐行的基础上工作?

无论哪种方式,我希望有人可以帮助我。在文件中,我想删除与以下模式匹配的所有内容或接近该模式的内容:

<key>Thumbnail<\/key>[^<]*<\/data>

在文件中它看起来像这样:

            // Other keys and values

            <key>Thumbnail</key>
            <data>
            TU0AKgAAOEi25Pqx3/ip2fak0vOdzPCVxu2RweuPv+mLu+mIt+aGtuaEtOSB

            ...

            dCBBcHBsZSBDb21wdXRlciwgSW5jLiwgMjAwNQAAAAA=
            </data>

            // Other keys and values

谁知道我怎么能这样做?此外,如果有任何更好的工具,我可以在终端中使用,我也想知道这一点:)

Answers:


4

命令行上有两个专门用于处理首选项列表文件的实用程序:defaults(in /usr/bin)和PlistBuddyin(/usr/libexec)。

仍在使用sed

sed允许使用D而不是d标志来删除多行。

例如。sed -e '/<key>Thumbnail<\/key>/, /<\/data>/D' < /PATH/TO/FILE.txt删除键缩略图的所有实例及其关联数据。

使用defaults

defaults delete /PATH/TO/PLIST "Thumbnail"。不要将.plist扩展名包含在路径中。此外,这只适用于a中的根级项目.plist,因此如果Thumbnail键位于另一个数组或dict中,则它将无效。

使用PlistBuddy

/usr/libexec/PlistBuddy -c "Delete :Thumbnail" /PATH/TO/PLIST.plist。如果缩略图键是嵌套的,则可以在它之前附加路径(如果您知道它)。例如。PlistBuddy -c "Delete :User:Thumbnail"如果缩略图条目在用户词典中。


0

XMLStarlet是一个用于操作XML的强大命令行工具。它的主要问题是1)它是一个非常复杂的工具(因为它做了非常复杂的工作),2)你可能不得不自己为OS X构建它。


0

使用awk,而不是sed

$ cat file
asdkf
asdklf
            // Other keys and values

            <key>Thumbnail</key>
            <data>
            TU0AKgAAOEi25Pqx3/ip2fak0vOdzPCVxu2RweuPv+mLu+mIt+aGtuaEtOSB

            ...

            dCBBcHBsZSBDb21wdXRlciwgSW5jLiwgMjAwNQAAAAA=
            </data>

            // Other keys and values

ksdf

$ awk 'BEGIN{RS="</data>"} /<key>/{ gsub("<key>.*</key>|<data>.*","") }1' file
asdkf
asdklf
            // Other keys and values





            // Other keys and values

ksdf

声明说,使用</data>作为记录分隔符,然后更换标签<key><data>什么也没有,当<key>在记录中发现


0

有可能用sed做到这一点,但这很难。Perl可以更轻松地做到这一点。perl脚本的内容是:

undef $/; # This allows reading in of all lines in one swoop

$contents = <>; # Read in contents of file (specified on command line)

$contents = s{<key>Thumbnail</key>.*?</data>}{}s;

print $contents;

如果您在名为change.plx的perl脚本中有上述内容,并且您将数据放在名为keyfile的文件中,那么您可以通过执行以下操作来修复该文件:

$ perl change.plx keyfile > /tmp/$$ && cat /tmp/$$ > keyfile && rm /tmp/$$

当然,请确保备份您执行此操作的任何文件。可以在命令行上使用单行perl程序对多个文件执行所有这些工作,如下所示:

$ perl -p0777i -e 's{<key>Thumbnail</key>.*?</data>}{}s;' file file file ...

马尼克斯


从我的正则表达式中删除了一些东西。我是这个网站的新手,我猜测任何类似html的表达都需要被转义。正则表达式应该是(希望它能在这个评论中起作用):s {Thumbnail。*?</ data>} {} s Marnix
Marnix A. van Ammers 2010年

1
您需要使用4个空格缩进代码示例。认为编辑器上方还有一个代码按钮,您可以在选择代码时单击该按钮。
Svish 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.