我正在尝试解码一个文件,该文件主要是使用base64编码的。我想做的是解码以下内容,同时仍然保持[_*_]
。
wq9cXyjjg4QpXy/Crwo=
[_NOTBASE64ED_]
aGkgdGhlcmUK
[_CONSTANT_]
SGVsbG8gV29ybGQhCg==
有时会是这种形式
aGkgdGhlcmUK[_CONSTANT_]SGVsbG8gV29ybGQhCg==
¯\_(ツ)_/¯
[_NOTBASE64ED_]
hi there
[_CONSTANT_]
Hello World!
hi there[_CONSTANT_]Hello World!
¯\_(ツ)_/¯
4��!:�@�H\�B�8ԓ��[��ܛBbase64: invalid input
base64 -di example.txt
base64 -d example.txt
base64 --wrap=0 -d -i example.txt
我尝试使用[_*_]
分别对grep -o
进行base64处理。然后找到并
通过使用数组的怪异排列来替换它们,但是我不能
让它工作。
将所有内容都进行base64处理,然后解码。产生双base64支持的行。
文件已大大缩小!
使用base64 --wrap=0
,while循环和if / else语句进行编码。
[_*_]
在解码后仍需要在那里。
答案 0 :(得分:0)
您需要一个循环来读取每行并测试它是base64还是非base64,并进行适当处理。
while read -r line
do
case "$line" in
\[*\]) echo "$line" ;;
*) base64 -d <<< "$line" ;;
esac
done << example.txt
答案 1 :(得分:0)
我敢肯定,有人会提供比这更聪明的解决方案。但是试试这个
#! /bin/bash
MYTMP1=""
function printInlineB64()
{
local lines=($(echo $1 | sed -e 's/\[/\n[/g' -e 's/\]/]\n/g'))
OUTPUT=""
for line in "${lines[@]}"; do
MYTMP1=$(base64 -d <<< "$line" 2>/dev/null)
if [ "$?" != "0" ]; then
OUTPUT="${OUTPUT}${line}"
else
OUTPUT="${OUTPUT}${MYTMP1}"
fi;
done
echo "$OUTPUT"
}
MYTMP2=""
function printB64Line()
{
local line=$1
# not fully base64 line
if [[ ! "$line" =~ ^[A-Za-z0-9+/=]+$ ]]; then
printInlineB64 "$line"
return
fi;
# likely base64 line
MYTMP2=$(base64 -d <<< "$line" 2>/dev/null)
if [ "$?" != "0" ]; then
echo $line
else
echo $MYTMP2
fi;
}
FILE=$1
if [ -z "$FILE" ]; then
echo "Please give a file name in argument"
exit 1;
fi;
while read line; do
printB64Line "$line"
done < ${FILE}
这是输出
$ cat example.txt && echo "==========================" && ./base64.sh example.txt
wq9cXyjjg4QpXy/Crwo=
[_NOTBASE64ED_]
aGkgdGhlcmUK
[_CONSTANT_]
SGVsbG8gV29ybGQhCg==
==========================
¯\_(ツ)_/¯
[_NOTBASE64ED_]
hi there
[_CONSTANT_]
Hello World!
$ cat example2.txt && echo "==========================" && ./base64.sh example2.txt
aGkgdGhlcmUK[_CONSTANT_]SGVsbG8gV29ybGQhCg==
==========================
hi there[_CONSTANT_]Hello World!
答案 2 :(得分:0)
我建议使用sh
以外的其他语言,但这是使用cut
的解决方案。这样可以处理一行中有多个[_constant_]
的情况。
#!/bin/bash
function decode() {
local data=""
local line=$1
while [[ -n $line ]]; do
data=$data$(echo $line | cut -d[ -f1 | base64 -d)
const=$(echo $line | cut -d[ -sf2- | cut -d] -sf1)
[[ -n $const ]] && data=$data[$const]
line=$(echo $line | cut -d] -sf2-)
done
echo "$data"
}
while read -r line; do
decode $line
done < example.txt
答案 3 :(得分:0)
如果可以选择Perl,则可以这样说:
perl -MMIME::Base64 -lpe '$_ = join("", grep {/^\[/ || chomp($_ = decode_base64($_)), 1} split(/(?=\[)|(?<=\])/))' example.txt
下面的代码与上面的代码等效,但出于说明目的分为以下步骤:
#!/bin/bash
perl -MMIME::Base64 -lpe '
@ary = split(/(?=\[)|(?<=\])/, $_);
foreach (@ary) {
if (! /^\[/) {
chomp($_ = decode_base64($_));
}
}
$_ = join("", @ary);
' example.txt
-MMIME::Base64
选项将加载base64编解码器模块。-lpe
选项使Perl像AWK一样循环输入行并隐式处理换行符。(?=\[)|(?<=\])
匹配base64块和由[...]包围的维护块之间的边界。split
函数将线在边界上划分为块,并将它们存储在数组中。