С помощью sed
вы можете выбирать диапазоны и удалять их:
sed '/<script/,/<\/script>/d' inputfile
Если вы просто хотите напечатать 1234567890123456789
, вы можете сделать это с помощью:
$ printf "%s" $(seq 1 9) $(seq 0 9)
1234567890123456789$
Это не будет иметь завершающей строки новой строки, так что, возможно, вы предпочитаете:
$ printf "%s" $(seq 1 9) $(seq 0 9) $'\n'
1234567890123456789
$
Несколько простых вариантов, если вам не нужно для использованияseq
:
$ perl -le 'print 1..9,0,1..9'
1234567890123456789
$ printf "%s" {1..9} {0..9} $'\n'
1234567890123456789
Поскольку вы упомянули переносимость, я рекомендую вам использовать подход perl
, или если вы, вероятно, столкнетесь с системами без perl
, но вам нужна одна и та же команда для запуска в оболочках, включая bash
, sh
, dash
, tcsh
и т. д., попробуйте подход Камиля .
Рассмотрим также:
printf '%d' $(seq -w 1 1 99 | cut -c2)
Мы генерируем числа 01..99, ноль -с дополнением (-w
), затем убираем разряд десятков -. Эти -номера позиций затем отправляются в printf
для печати по отдельности.
Чтобы получить желаемый результат, используйте 19
вместо:
$ printf '%d' $(seq -w 1 1 19 | cut -c2)
1234567890123456789
Вы можете удалить новые строки из любого потока с помощью tr -d '\n'
. В вашем случае
(seq -s '' 1 9 ; echo -n 0; seq -s '' 1 9) | tr -d '\n'
В то время как другие ответы могут быть сосредоточены на изменении вашего исходного подхода, это способ, который должен просто удалять символы новой строки независимо от того, что было до |
.
Я предполагаю, что вам нужна не просто эта конкретная строка, а строки с увеличивающимися цифрами переменной длины. Для этого может быть полезно иметь возможность изменить ширину, изменив одно число, вместо того, чтобы создавать ее из нескольких вызовов seq
.
В Bash вы можете использовать что-то вроде этого (для последовательности длиной 19 -):
for ((i=1; i <= 19; i++)); do printf "%d" "$(( i % 10 ))"; done; echo
Это должно работать в стандартной оболочке (и в любом случае работает как минимум в dash и busybox):
i=1; while [ "$i" -le 19 ]; do printf "%d" "$(( i % 10 ))"; i=$((i+1)); done; echo
Интересно, почему вы просто не:
echo 1234567890123456789
А какой смысл печатать всего 19 колонок вместо 20?
Если вы хотите повторить (по умолчанию :для всей ширины терминала)
chdr(){ c=${1:-$COLUMNS}; while [ "$c" -gt 0 ]; do printf '%.*s' "$c" 1234567890; c=$((c-10)); done; echo; }
chdr 17
12345678901234567
chdr
12345678901234567890123456789012345678901234567890123456789012345678901234567890
Конечно, вcsh
(это не сработает ).
К вашему сведению:seq
не является переносимым (есть jot
на *BSD, но он совершенно другой ).
При использованииtr
для избавления от завершающей новой -строки стоит понимать, что она удаляет все вхождения символов, указанных в опции -d
. Таким образом, вы можете сделать его немного тоньше :
(seq 1 9; echo 0; seq 1 9) | tr -d '\n'
— даже echo
больше не нужно иметь -n
.
И для полноты картины :BSD-версия seq
, когда указано -s ''
, не создает новую строку -при выходе.
Чтобы удалить завершающую новую строку, просто используйте выполнение команды:
$ echo "test$(seq -s '' 9)no-newline"
test12345679no-newline
Или записать в переменную:
$ var=$(seq -s '' 9); echo "${var}0${var}"
1234567890123456789
Или также:
$ printf '%s' {{0..9},0,{0..9}}; echo
1234567890123456789