Linux shell:Base64 Decode,删除换行符(Linux shell: Base64 Decode with removing line breaks)
我有一个文件,其中每一行都是base64编码的XML文档。 解码的XML文档可能包含换行符。 我想grep出每个包含给定单词的XML文档。
问题是,当我解码文件的行时,我为每个base64编码的行都有多行,我不能再对它进行grep了。 我需要像base64 decode + remove line breaks一步base64 decode + remove line breaks 。
我怎样才能在Linux shell中实现这一目标? 我有Python,Perl和awk可用。
>cat fileContainingBase64EncodedXMLsInEachLine.txt | what should I write here?
输入:
PGZvbz4NCjxiYXIvPg0KPC9mb28+
PGZvbz4NCjxodWh1Lz4NCjwvZm9vPg==
PGZvbz4NCjxiYXJvbWV0ZXIvPg0KPC9mb28+
预期产出
假设我想要包含'bar'的XML文档
我的问题的一个例子
>cat fileContainingBase64EncodedXMLsInEachLine.txt | base64 --decode | grep bar
提供:
所以我没有包含bar和barometer的完整xml文档。
I have a file where each line is a base64-encoded XML document. The decoded XML documents may contain new line characters. I would like to grep out each XML document containing a given word.
The problem is that, when I decode the lines of the file, I have multiple lines for each base64-encoded line and I cannot grep it any more. I need something like base64 decode + remove line breaks in one step.
How can I achieve that in the Linux shell? I have Python, Perl and awk available.
>cat fileContainingBase64EncodedXMLsInEachLine.txt | what should I write here?
Input:
PGZvbz4NCjxiYXIvPg0KPC9mb28+
PGZvbz4NCjxodWh1Lz4NCjwvZm9vPg==
PGZvbz4NCjxiYXJvbWV0ZXIvPg0KPC9mb28+
Expected Output
Let's say I want the XML documents containing 'bar'
An example for my problem
>cat fileContainingBase64EncodedXMLsInEachLine.txt | base64 --decode | grep bar
Delivers:
So I do not have the full xml documents containing bar and barometer.
原文:https://stackoverflow.com/questions/50483586
更新时间:2020-02-13 14:53
最满意答案
这是一些Python代码,它接受命令行上的搜索词后面的文件名。 像往常一样,如果arg包含空格,则必须引用它。
import sys
from base64 import b64decode
fname, pattern = sys.argv[1:]
with open(fname) as f:
for row in f:
row = b64decode(row).decode()
if pattern in row:
print(row, end='\n\n')
使用“bar”作为模式arg在您的数据上运行此命令:
为了练习我相当生疏的awk技能,我决定写一个awk命令行来做这件事。 它使用标准的base64命令进行解码。
awk 'BEGIN{cmd="base64 -d"}; {print |& cmd; close(cmd,"to"); z=""; while(cmd |& getline s) z=z s "\n"; close(cmd); if (z~pat)print z}' pat='bar' testdata_b64.txt
你使用pat参数传递它的模式,它可以是一个正则表达式。 您可以通过标准输入向其发送数据,也可以在命令行上为其提供一个或多个文件名。
请注意,正则表达式模式需要双重转义,例如pat='\\'匹配单词bar 。
Here's some Python code that accepts a filename followed by the search word on the commandline. As usual, if either arg contains spaces, it must be quoted.
import sys
from base64 import b64decode
fname, pattern = sys.argv[1:]
with open(fname) as f:
for row in f:
row = b64decode(row).decode()
if pattern in row:
print(row, end='\n\n')
Running this on your data with "bar" as the pattern arg gives:
In order to practice my rather rusty awk skills, I decided to write an awk command line to do this. It uses the standard base64 command to do the decoding.
awk 'BEGIN{cmd="base64 -d"}; {print |& cmd; close(cmd,"to"); z=""; while(cmd |& getline s) z=z s "\n"; close(cmd); if (z~pat)print z}' pat='bar' testdata_b64.txt
You pass it the pattern using the pat argument, which can be a regex. You can send data to it via standard input, or you can give it one or more filenames on the commandline.
Note that regex patterns need double escaping, eg pat='\\' matches the word bar.
2018-05-23
相关问答
您需要使用cat来获取名为“DSC_0251.JPG”的文件的内容 ,而不是文件名本身。 test="$(cat DSC_0251.JPG | base64)"
但是, base64可以从文件本身读取: test=$( base64 DSC_0251.JPG )
You need to use cat to get the contents of the file named 'DSC_0251.JPG', rather than the filename itself. test="$(ca
...
实际上Windows确实有一个实用程序来编码和解码base64 - CERTUTIL 我不知道什么版本的Windows引入了这个命令。 要对文件进行编码: certutil -encode inputFileName encodedOutputFileName
要解码文件: certutil -decode encodedInputFileName decodedOutputFileName
CERTUTIL有许多可用的动词和选项。 要得到几乎所有可用动词的列表: certutil -?
要
...
使用jq和base64 : jq -r '.[].Value' < file.json | base64 --decode
Using jq and base64: jq -r '.[].Value' < file.json | base64 --decode
您需要先创建引用的String数组。 你有 String[] s = null;
所以当你尝试使用诸如 s[i] = string;
然后s仍然为null,并且尝试获取s的i元素会给出空指针。 从剩下的代码中我想你想要一个与派对名称具有相同数量元素的String数组,所以你需要 String[] s = new String[partyname.length];
You need to create your String array that s references first. You
...
你正在做的是实际处理java指针而不是实际的字节。 这是正确的实施方式 byte[] bytesEncoded = Base64.encodeBase64(str .getBytes());
System.out.println("ecncoded value is " + new String(bytesEncoded ));
// Decode data on other side, by processing encoded data
byte[] valueDecoded= Base
...
我得到了这个问题。 文件中的行如下所示 QkVHSU46VkNBTEVOREFSDQpNRVRIT0Q6UkVRVUVTVA0KUFJPRElEOk1pY3Jvc29mdCBFeGNoYW5nZSBTZ
XJ2ZXIgMjAxMA0KVkVSU0lPTjoyLjANCkJFR0lOOlZUSU1FWk9ORQ0KVFpJRDpBVVMgRWFzdGVybiBTdG
最后有一个结束字符,所以我所要做的就是删除它。 因此,现在我的代码看起来如下&它的工作原理: - sed -e '1,/base6
...
您不能将任意数据解释为UTF-8编码的字符串,因此在大多数情况下, String(data: data, encoding: .utf8)将失败。 但是还有另一个AES初始化器,它接收二进制数据 (作为数组)而不是字符串,使转换为字符串过时: let data = Data(base64Encoded: base64data)!
let iv = Data(base64Encoded: base64iv)!
let decrypted = try! AES(Array(data), Array(
...
这是一些Python代码,它接受命令行上的搜索词后面的文件名。 像往常一样,如果arg包含空格,则必须引用它。 import sys
from base64 import b64decode
fname, pattern = sys.argv[1:]
with open(fname) as f:
for row in f:
row = b64decode(row).decode()
if pattern in row:
print(
...
base64要求输入和输出分别填充为3和4的倍数。 这是使用boost解码base64的功能: #include
#include
#include
#include
...
你有一个数据URI方案 ,有关如何解码它的信息以及更多关于这个问题和答案: 使用base64.StdEncoding.DecodeString(str)时输入字节4处的非法base64数据 但请注意, image.Decodeconfig()只会解码在调用此函数之前注册的图像格式,因此您需要提前注册图像格式处理程序。 这可以通过像这样的导入来完成 import _ "image/png"
更多关于这一点的是image包文档。 或者如果您知道确切的格式(例如在您的示例中它是PNG),您可以直接使用
...