Как экранировать символ в скрипте оболочки?

Как экранировать символ в скрипте оболочки?

Я хочу записать текст в другой файл с помощью скрипта оболочки echo, но данные не записываются в том формате, в котором я намеревался.

echo paste B01_reprojected_subset_comma_updated.csv  B02_reprojected_subset_comma_updated.csv B03_reprojected_subset_comma_updated.csv B04_reprojected_subset_comma_updated.csv B05_reprojected_subset_comma_updated.csv B06_reprojected_subset_comma_updated.csv B07_reprojected_subset_comma_updated.csv B08_reprojected_subset_comma_updated.csv B8A_reprojected_subset_comma_updated.csv B09_reprojected_subset_comma_updated.csv B10_reprojected_subset_comma_updated.csv B11_reprojected_subset_comma_updated.csv B12_reprojected_subset_comma_updated.csv |awk -F",||\t" '{print  $1","$2","$3","$6","$9","$12","$15","$18","$21","$24","$27","$30","$33","$36","$39}'>allbands.csv >> jobstext.sh

но я получаю такой текст в jobstext.sh

paste B01_reprojected_subset_comma_updated.csv B02_reprojected_subset_comma_updated.csv B03_reprojected_subset_comma_updated.csv B04_reprojected_subset_comma_updated.csv B05_reprojected_subset_comma_updated.csv B06_reprojected_subset_comma_updated.csv B07_reprojected_subset_comma_updated.csv B08_reprojected_subset_comma_updated.csv B8A_reprojected_subset_comma_updated.csv B09_reprojected_subset_comma_updated.csv B10_reprojected_subset_comma_updated.csv B11_reprojected_subset_comma_updated.csv B12_reprojected_subset_comma_updated.csv,,,,,,,,,,,,,,

Я попытался экранировать специальный символ, но данные все равно не в точном формате.

кто-нибудь может мне помочь это сделать?

paste B01_reprojected_subset_comma_updated.csv B02_reprojected_subset_comma_updated.csv B03_reprojected_subset_comma_updated.csv B04_reprojected_subset_comma_updated.csv B05_reprojected_subset_comma_updated.csv B06_reprojected_subset_comma_updated.csv B07_reprojected_subset_comma_updated.csv B08_reprojected_subset_comma_updated.csv B8A_reprojected_subset_comma_updated.csv B09_reprojected_subset_comma_updated.csv B10_reprojected_subset_comma_updated.csv B11_reprojected_subset_comma_updated.csv B12_reprojected_subset_comma_updated.csv |awk -F",||\t" '{print  $1","$2","$3","$6","$9","$12","$15","$18","$21","$24","$27","$30","$33","$36","$39}'>allbands1.csv

решение1

Чтобы оболочка не касалась вашего текста (включая специальные символы, такие как $и >или ) *, заключите все в одинарные кавычки. Чтобы включить одинарные кавычки в строку, вам нужно прервать строку в кавычках и добавить одинарную кавычку, экранированную обратной косой чертой, в результате чего получится 'here comes the embedded '\''quote':

echo 'paste B01_reprojected_subset_comma_updated.csv  B02_reprojected_subset_comma_updated.csv B03_reprojected_subset_comma_updated.csv B04_reprojected_subset_comma_updated.csv B05_reprojected_subset_comma_updated.csv B06_reprojected_subset_comma_updated.csv B07_reprojected_subset_comma_updated.csv B08_reprojected_subset_comma_updated.csv B8A_reprojected_subset_comma_updated.csv B09_reprojected_subset_comma_updated.csv B10_reprojected_subset_comma_updated.csv B11_reprojected_subset_comma_updated.csv B12_reprojected_subset_comma_updated.csv |awk -F",||\t" '\''{print  $1","$2","$3","$6","$9","$12","$15","$18","$21","$24","$27","$30","$33","$36","$39}'\''>allbands.csv' >> jobstext.sh

решение2

Будет проще, если вы разделите печать и используете printfстроки форматирования для организации вывода. Во-первых, команда вставки, использующая расширение скобок:

printf "%s " paste B{01..12}_reprojected_subset_comma_updated.csv >> jobstext.sh

Затем команда awk, упрощенная с использованием OFS:

printf "| %s '%s' %s %s '%s' > %s\n" awk -F',|\t' -v OFS=, '{print $1, $2, $3, $6, $9, $12, $15, $18, $21, $24, $27, $30, $33, $36, $39}' allbands1.csv >> jobstext.sh

Вы также можете использовать %qдля упрощения строк форматирования, используемых для printf.

решение3

Без образца ваших файлов или четкого описания того, что вы хотите сделать, или желаемого формата выходного файла это просто догадки. Возможно, вы хотите добавить командную строку (paste stuff|awk action) в файл jobstext.sh. Это было бы лучше сделать с помощью редактора, чтобы избежать проблем с вложенными кавычками...

Но ваш вопрос касается экранирования специальных символов, поэтому для ответа на него одним из вариантов является инкапсуляция одинарной кавычки в двойные кавычки. Сокращая ваши длинные имена файлов до B01 и т. д., это будет выглядеть так, как показано ниже.

echo 'paste B01 B02 B03 B04 B05 B06 B07 B08 B8A B09 B10 B11 B12 |
awk -F",||\t" '"'"'{print "$1","$2","$3","$6","$9","$12","$15","$18","$21",
"$24","$27","$30","$33","$36","$39}'"'"' >allbands.csv' >> jobstext.sh

Первая одинарная кавычка начинает строку, которая включает команду вставки, имена файлов, канал, awk и опцию F. Затем первая одинарная кавычка последовательности '"'"'закрывает строку, следующие 3 символа определяют другую строку одинарной кавычки, а последний символ — это одинарная кавычка, начинающая третью строку (включающую действие awk в фигурных скобках). Похожая последовательность из 5 кавычек закрывает эту строку, вставляет еще одну одинарную кавычку и начинает пятую строку (которая состоит из перенаправления вывода в allbands.csv). Наконец, эта строка закрывается (с последней кавычкой строки), поэтому все 5 строк объединяются и добавляются в jobstext.sh.

Это обременительно, но именно это и происходит, когда пытаешься использовать два уровня одинарных кавычек в одной командной строке. Одинарные кавычки необходимы для того, чтобы предотвратить интерпретацию оператора awk оболочкой.

Улучшения были бы следующими: 1) использовать имена файлов, которые можно было бы расширить *(но ваш "B8A" вносит несоответствие, которое препятствует простому расширению имени файла), и 2) упростить команду, отредактировав ее в jobstext.sh. Предложения в ответе @muru стоит включить (но будьте осторожны с этим файлом "B8A"!)

Связанный контент