Наконец, я сделал это. от liveCD (Archbang в моем случае) под корнем:
Это должно работать. Wiki Archlinux имеет статью, которая объясняет процесс более подробно.
file="B1_Site4_5aT4ZNHN691AQSB6B65_KYEC_SLT_2013-11-24-00-30_935985e7_100m_PASS1.tar"
с GNU grep
при создании с поддержкой PCRE (и с zsh
или последние версии ksh93
или bash
для <<<
):
grep -oP '(?<=Z).{6}' <<< "$file" > file
с ksh93
, bash
или последние версии zsh
:
tmp=${file#*Z} # remove chars up to the first Z
echo "${tmp:0:6}" > file
Только для забавы, awk
awk -F Z '{print substr($2, 1, 6)}' <<< "$file"
expr B1_Site4_5aT4ZNHN691AQSB6B65_KYEC_SLT_2013-11-24-00-30_935985e7_100m_PASS1.tar : '.*Z\(.\{6\}\)' > file
Или только с оболочкой
string=B1_Site4_5aT4ZNHN691AQSB6B65_KYEC_SLT_2013-11-24-00-30_935985e7_100m_PASS1.tar
printf '%.6s\n' "${string#*Z}" > file
(первый будет считать последний Z сопровождаемым 6 символами, второй первое; поведение будет варьироваться если их не ZXXXXXX там).
>>echo \
B1_Site4_5aT4ZNHN691AQSB6B65_KYEC_SLT_2013-11-24-00-30_935985e7_100m_PASS1.tar |
sed 's/.*Z\(.\{6\}\).*/\1/'
>>NHN691
Добавление a >file
поместит его в файл.
sed
правильный выбор. Однако поместите '|' в конце echo
строка, и у Вас нет к обратной косой черте новой строки для продолжения конвейера.
– Bruce Ediger
11.01.2014, 00:03
sed
работы над каждой строкой его входа, не целого входа, так так или иначе expr
является более соответствующим (echo
имеет несколько проблем, связанных с ним также для произвольных данных).
– Stéphane Chazelas
11.01.2014, 00:35