linux shell 去除回车,Linux shell:Base64 Decode,删除换行符(Linux shell: Base64 Decode with removing line break...

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),您可以直接使用

...

你可能感兴趣的:(linux,shell,去除回车)