Как избежать печати новой строки, когда SEQ завершится?

С помощью sed вы можете выбирать диапазоны и удалять их:

sed '/<script/,/<\/script>/d' inputfile
7
04.01.2019, 04:44
7 ответов

Если вы просто хотите напечатать 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и т. д., попробуйте подход Камиля .

10
27.01.2020, 20:13

Рассмотрим также:

printf '%d' $(seq -w 1 1 99 | cut -c2)

Мы генерируем числа 01..99, ноль -с дополнением (-w), затем убираем разряд десятков -. Эти -номера позиций затем отправляются в printfдля печати по отдельности.

Чтобы получить желаемый результат, используйте 19вместо:

$ printf '%d' $(seq -w 1 1 19 | cut -c2)
1234567890123456789
4
27.01.2020, 20:13

Вы можете удалить новые строки из любого потока с помощью tr -d '\n'. В вашем случае

(seq -s '' 1 9 ; echo -n 0; seq -s '' 1 9) | tr -d '\n'

В то время как другие ответы могут быть сосредоточены на изменении вашего исходного подхода, это способ, который должен просто удалять символы новой строки независимо от того, что было до |.

6
27.01.2020, 20:13

Я предполагаю, что вам нужна не просто эта конкретная строка, а строки с увеличивающимися цифрами переменной длины. Для этого может быть полезно иметь возможность изменить ширину, изменив одно число, вместо того, чтобы создавать ее из нескольких вызовов 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
5
27.01.2020, 20:13

Интересно, почему вы просто не:

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, но он совершенно другой ).

0
27.01.2020, 20:13

При использованииtrдля избавления от завершающей новой -строки стоит понимать, что она удаляет все вхождения символов, указанных в опции -d. Таким образом, вы можете сделать его немного тоньше :

.
(seq 1 9; echo 0; seq 1 9) | tr -d '\n'

— даже echoбольше не нужно иметь -n.

И для полноты картины :BSD-версия seq, когда указано -s '', не создает новую строку -при выходе.

0
27.01.2020, 20:13

Чтобы удалить завершающую новую строку, просто используйте выполнение команды:

 $ 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
1
27.01.2020, 20:13

Теги

Похожие вопросы