我从外部程序获取一个字符串,并且我想获取该字符串的每个部分:
\documentclass{article}
\usepackage{bashful}
\begin{document}
% Test.sh would do echo "4 8 15 16 23 42"
\let\data{\splice{./test.sh}}
\begin{itemize}
\item \getOccurences{2}{\data} %15
\item \getOccurences{5}{\data} %23
\end{itemize}
\end{document}
读取的信息stdout
是一系列用空格分隔的数字。
我该如何实现这个\getOccurences
宏呢?
答案1
该xstring
包中有一个宏StrBetween[n,m]{full string}{string A}{string B}
可能对此有所帮助。它将选择字符串 A 第 n 次出现和字符串 B 第 m 次出现之间的子字符串。在这种情况下,您可以将字符串 A 和字符串 B 都设置为空格,并提取第 2 个和第 3 个空格之间的字符串以获得 15,提取第 4 个和第 5 个空格之间的字符串以获得 23。
问题的第二部分是将外部输出转换为xstring
可以处理的格式。这有点棘手。\splice
在后台做了很多事情,这在扩展用于字符串处理的宏时会造成麻烦。更好的替代方法是使用\bashStdout
定义的,bashful
将最后一个块的输出捕获\bash \END
为纯字符串。这里唯一的问题是空格有类别代码 12,这也会造成混淆xstring
。作为解决方案,您可以使用“展平”字符串\detokenize
。这还有一个额外的好处,您可以使用\edef
扩展参数,允许在执行和实际使用值之间使用其他\bash \END
块(将覆盖)。\bashStdout
梅威瑟:
\documentclass{article}
\usepackage{bashful}
\usepackage{xstring}
\begin{document}
\bash
echo "4 8 15 16 23 42"
\END
\edef\data{\detokenize\expandafter{\bashStdout}}
All data: \data
\begin{itemize}
\item \StrBetween[2,3]{\data}{ }{ } %15
\item \StrBetween[4,5]{\data}{ }{ } %23
\end{itemize}
\end{document}
结果:
答案2
此答案介绍了输入字符串后如何解析该字符串。因此,对于此示例,我仅使用 定义字符串\def
。我使用listofitems
包创建单个字符串元素的数组。
\documentclass{article}
%\usepackage{bashful}
\usepackage{listofitems}
\setsepchar{ }
\ignoreemptyitems
\begin{document}
% Test.sh would do echo "4 8 15 16 23 42"
%\let\data{\splice{./test.sh}}
\def\data{4 8 15 16 23 42}
\readlist\mylist{\data}
\mylist[3] should be 15
\mylist[5] should be 23
\end{document}