$ cat f.html
<h1>head</h1>
<p>hello</p>
<p>world</p>
$ grep -o '<p>.*</p>' f.html | tr '[:lower:]' '[:upper:]' | sed 's/P>/p>/g'
<p>HELLO</p>
<p>WORLD</p>
# capture other tags: grep multi-pattern e.g 'patt1\|patt2\|pattN'
$ grep -o '<p>.*</p>\|<h1>.*</h1>' f.html | tr '[:lower:]' '[:upper:]' | sed 's/P>/p>/g;s/H1>/h1>/g'
<h1>HEAD</h1>
<p>HELLO</p>
<p>WORLD</p>
# add line after h1 tag : grep+tr+sed
function foo () {
grep -o '<p>.*</p>\|<h1>.*</h1>' "${1}" | tr '[:lower:]' '[:upper:]' | sed 's/P>/p>/g;s/H1>/h1>/g' | while read line; do
case "${line}" in
"<h1>"*)
echo "${line}"
echo "anything that should appear after h1 tags"
;;
"<p>"*)
echo "${line}"
;;
esac
done
}
$ foo f.html
<h1>HEAD</h1>
anything that should appear after h1 tags
<p>HELLO</p>
<p>WORLD</p>
# add line after h1 tag : few [shell parameter expansion] tips + while & case statments
function foo () {
grep -o '<p>.*</p>\|<h1>.*</h1>' "${1}" | while read line; do
case "${line}" in
"<h1>"*)
line="${line^^}"; #capitalize (shell parameter expansion)
echo "${line//H1>/h1>}" # find replace (shell parameter expansion)
echo "anything that should appear after h1 tags"
;;
"<p>"* | "<P>"*) # if html files contain capitalized P tag and you wanna capture them
line="${line^^}"; #capitalize
echo "${line//P>/p>}" # find replace
;;
"<foo>"*)
line="${line^^}"; #capitalize
linopenintag="${line//<foo>/}"; # <foo>hello world</foo> ==> hello world</foo>
innerHTML="${linopenintag//<\/foo>/}"; # hello world</foo> ==> hello world
innerHTMLarr=(${innerHTML}); # in case i want to put each word in a spin or/and style that word differently
for eachword in ${innerHTMLarr[@]}; do
if [[ "${eachword}" == "something" ]]; then # capture special words...
echo "<bar style='...'> ${eachword} </bar>"
else
echo "<bar> ${eachword} </bar>"
fi
done
;;
esac
done
}
$ foo f.html
<h1>HEAD</h1>
anything that should appear after h1 tags
<p>HELLO</p>
<p>WORLD</p>
Одна из возможностей состоит в том, чтобы закодировать двоичный файл как текст ASCII, используя либо традиционный uuencode , либо несколько более современный base64
. Программы uuencode
и uudecode
входят в состав пакета sharutils , а base64
— в coreutils . Похоже, что base64
уже присутствует в современном дистрибутиве GNU/Linux.
Результатом кодирования двоичного файла является большой объем текста, который в принципе можно скопировать/вставить по терминальному соединению в декодер на target
. При большом количестве данных использование буфера обмена может быть нецелесообразным, но мы можем использовать средства screen
для вставки содержимого файла в терминал.
source
запустите base64 FILE > FILE.b64
.screen
, подключенном к target
, введите Ctrl -A :readreg p /path/to/FILE.b64
. (Если ваша управляющая клавиша screen
отличается от Ctrl -A, введите ее. )Кажется, вы должны указать полный путь к FILE.b64; ~не работает. Экран должен сообщить что-то вроде «В буфер введено 26665052 символа». target
запустите base64 -d > FILE
. :paste p
. Другим давно -проверенным способом решения этой проблемы является ZModem , почтенный метод передачи файлов через терминальные соединения. Поддержка ZModem встроена во многие эмуляторы терминала, такие как Konsole, если установлен пакет lrzsz
. Однако есть вероятность, что lrzsz не установлен, поэтому лучше использовать base64.
Все эти методы решают проблему передачи файла по последовательному каналу, который вы используете в данный момент для консоли. Если вам не нужна консоль, будет проще сделать так, чтобы target
выгружала что-либо из ссылки в файл; но это будет проблематично, если последовательная консоль — ваш единственный способ взаимодействия с устройством!
Основываясь на ответах всех и учитывая установленные утилиты на target
, я нашел решение, которое работает, выполняя скрипт только из source
. Сценарий выглядит следующим образом:
dest="/dev/$(dmesg | grep "now attached to ttyUSB" | awk '{print$NF}' | tail -1)"
cat binfile | gzip | base64 > binfile.64.gz
md5=$(md5sum binfile | awk '{print $1}')
printf "\necho \"[ \\\$(md5sum <target-dir>/binfile | awk '{print \\\$1}') == %s ] &&\\
<flashing commands>\" > <target-dir>/flash.sh\n" \
"$md5" \
> "$dest"
printf " echo \"%s\" | base64 -d | gunzip > <target-dir>/binfile &&\\
/bin/sh <target-dir>/flash.sh
" "$(cat binfile.64.gz)" \
> "$dest"
Он отправляет программу прошивки, которая проверяет, совпадают ли контрольные суммы исходного и целевого bin-файлов
сжимает и кодирует bin-файл,
посылает его,
и использует программу прошивки для прошивки карты. Если что-то сломается при кодировании/декодировании, оно не должно прошивать цель. Любая другая проблема вряд ли вызовет проблемы в системе, поскольку простая перезагрузка вернет ее в состояние по умолчанию.
Вот ссылка на мою полную реализацию этого процесса:
https://github.com/Soulthym/cycloneV-serial-flasher