Судя по вашему вопросу (, поскольку нет примеров ), я бы сказал, что ^@
в большом файле на самом деле не два символа(^
и @
), а один из тех непечатаемых символов.
Вы можете ввести этот непечатаемый символ в терминал с помощью Ctrl + v
+ Ctrl + 2
.
Используйте это в sed
вместо символов ^
и @
, и все должно быть в порядке.
Также удалите управляющую последовательность, поскольку она не нужна для непечатаемого символа.
Это ложное срабатывание, но это не то, что вы думаете. Это не имеет ничего общего с *
и не указывало мне на него. Он расстроен тем, что `Name`
находится внутри одинарных кавычек. Например, echo '`Name`'
выдает такое же предупреждение, потому что думает, что вы хотите, чтобы обратные кавычки оценивались, поэтому предупреждает, что этого не будет.
Не ответ, а отформатированный комментарий:
Педантично, вы не должны использовать цикл for
,но петля while read
:
while IFS= read -r server; do
: do stuff here
done < <(
"$aws" ec2 describe-instances \
--query 'Reservations[].Instances[][].{Name: Tags[?Key==`Name`].Value[] | [0]}' \
--filters "Name=tag:Name,Values=${server_name}*" \
--output text
)
for
циклов чтения пробелов -разделенных слов , while
циклов чтения строк--см.http://mywiki.wooledge.org/BashFAQ/001
В качестве альтернативы используйте readarray
для захвата вывода
readaray -t servers < <(
"$aws" ec2 describe-instances \
--query 'Reservations[].Instances[][].{Name: Tags[?Key==`Name`].Value[] | [0]}' \
--filters "Name=tag:Name,Values=${server_name}*" \
--output text
)
for server in "${servers}"; do...; done
Наконец, для длинных и нечитаемых команд сохранение параметров в массиве может улучшить читаемость:
opts=(
--query 'Reservations[].Instances[][].{Name: Tags[?Key==`Name`].Value[] | [0]}'
--filters "Name=tag:Name,Values=${server_name}*"
--output text
)
readarray -t servers < <("$aws" ec2 describe-instances "${opts[@]}")