我使用xidel
从SAMLResponse中提取//Assertion//Signature//KeyInfo//X509Certificate/text()
,这是一个长base64字符串形式的X509证书。
我想把这个字符串分成64个字符块
我尝试使用tokenize()
和replace()
,但我可以使它们工作,replace()
似乎不允许我在替换字符串中使用换行符\n
:
echo "$SAMLRESPONSE" | base64 -D | xidel --xpath 'replace(//Assertion//Signature//KeyInfo//X509Certificate/text(),"(.{64})","$1\n")' -
**** Processing: stdin:/// ****
Error:
err:FORX0004: Invalid replacement: $1\n after $1\n
Possible backtrace:
$000000010203F668: perhaps TXQTermTryCatch + 222920 ? but unlikely
$0000000102068BBE: perhaps Q{http://www.w3.org/2005/xpath-functions}tokenize + 166350 ? but unlikely
$000000010203FF78: Q{http://www.w3.org/2005/xpath-functions}replace + 376
$0000000101FF853F: TXQTermNamedFunction + 767
$0000000101F71CE7: perhaps ? ? but unlikely
Call xidel with --trace-stack to get an actual backtrace
和tokenize将整个匹配视为分隔符,和分隔符不包括在输出中
echo "$SAMLRESPONSE" | base64 -D | xidel --xpath 'tokenize(//Assertion//Signature//KeyInfo//X509Certificate/text(),"(?:.{64})")' -
**** Processing: stdin:/// ****
XACcI5tcJbgsvr+ivGPos/WrhywkROwbEBh6OTNXTnaBiiIK
在XPath中有没有办法将字符串分割成固定宽度的块?
3条答案
按热度按时间zvms9eto1#
您的第一个想法没有错,您只需要使用代码点到字符串函数来生成换行符:
**注意:**我将正则表达式修改为
.{1,64}
,以确保“replaced”字符串始终以换行符结尾**ASIDE:**首先,您甚至不需要使用XPath构建完整的输出。
8fsztsew2#
这可以更简单地完成,并且全部使用
xidel
:binary-to-string()
extract()
o2gm4chl3#
如果你知道某个字符肯定不会出现在原始字符串中(例如
$
在base64或base64url中不是法律的字符),那么你可以将tokenize()
和replace()
组合起来以获得预期的结果:在上面的命令中,首先应用
replace()
来匹配64个字符的组,并用其自身加上末尾的$
来替换该组,然后使用$
作为tokenize
的分隔符。同样,只有当你可以访问一些你知道它不能出现在原始字符串中的字符时,比如base64中的
$
。