Использование sed для замены чисел на @ insert @ между каждым символом

Не копируйте папку, только копируйте ее содержимое:

## Create the target directory. The -p suppresses error messages
## if the directory already exists
mkdir -p outputFolder

## Copy the contents recursively, this will not recreate the parent
cp -R inputfolder/* outputfolder/

Таким образом вы оба убедитесь, что целевой каталог создается при первом запуске скрипта и избежать проблемы при повторном запуске.

Крис Даун очень правильно указывает, что в bash будут пропущены файлы, имена которых начинаются с . . Чтобы избежать этого, вы можете запустить shopt -s dotglob перед выполнением указанной выше команды.

Оба параметра -p для mkdir и -R для cp определены POSIX, так что это должно быть идеально переносимым.

3
06.01.2018, 22:09
3 ответа

Заменить *любым специальным символом можно с помощью команды tr.

#!/bin/bash
mystring="This is my number: 12345"
echo $mystring | sed 's/[0-9]/*/g'
0
25.09.2021, 19:14
echo "abc 434 pankaj 444"| tr "[0-9]" "@"

abc @@@ pankaj @@@
0
25.09.2021, 19:27

В зависимости от того, хотите ли вы заменить цифры или целые числа (наборы последовательных цифр )на @, вы можете использовать команду trбез или с опцией -s:

$ echo "abc 434 pankaj 444" | tr '[:digit:]' '[@*]'
abc @@@ pankaj @@@
$ echo "abc 434 pankaj 444" | tr -s '[:digit:]' '[@*]'
abc @ pankaj @

Опция -sкоманды trзаставляет утилиту «выжимать» любой последовательно встречающийся символ из второго аргумента, найденного в данных. В этом случае использование -sприводит к тому, что trобъединяет наборы символов @в одиночные символы @.

Два аргумента [:digit:]и [@*]сообщают trзаменить цифры символами @. Большинство (всех? )реализации trпозволяют вам писать @вместо [@*]в качестве второго аргумента. [@*]буквально означает «столько @, сколько символов в наборе, описанном первым аргументом».

Обратите внимание, что trбудет сжимать во входных данных любые до -существующие последовательности последовательных @символов, если действует -s.


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

Модифицированная подстановка, которая будет работать правильно и заменит ряды цифр одним @, будет

sed 's/[[:digit:]]\{1,\}/@/g'

Используя \{1,\}вместо *(, что само по себе является тем же самым, что и \{0,\}), мы обеспечиваем по крайней мере одно соответствие предыдущему выражению.Вы увидите, что \{1,\}записывается как +в расширенных регулярных выражениях.

Удалив \{1,\}из выражения, оставив замену как s/[[:digit:]]/@/g, вы замените каждую отдельную цифру на @.

0
26.09.2021, 12:55

Теги

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