Проблема в том, что sed
является жадным, поэтому приведенная выше команда вернет substring2
, только если вы добавите глобальный флаг (g
):
Вы можете использовать awk
для этого, где выпереопределите разделитель поля FS
, чтобы он стал строкой token
.Таким образом, ваши строки располагаются на четных позициях поля:
$ echo "blahblah token substring token something else token substring2 token" | \
awk -F 'token' '{for(i=2;i<=NF;i+=2) {print $i}}'
substring
substring2
update:
Если вы вводите xml-файл, вы можете захотеть сделать:
<archive>
<message id="0">
<receiver>apr</receiver>
<sender>gtr</sender>
<text>52333</text>
<sendTime>554</sendTime>
<deliveryTime>765</deliveryTime>
</message>
<message id="0">
<receiver>apr</receiver>
<sender>gtr</sender>
<text>4332</text>
<sendTime>764</sendTime>
<deliveryTime>922</deliveryTime>
</message>
</archive>"
, ведущий к cmd:
xmlstarlet sel -t -m '//message' -v receiver -o " " -v sender -o " " -v text -n <file>
, который выводит
apr gtr 52333
apr gtr 4332