Заменить все экземпляры строки, кроме последнего

Чтобы было проще запустить новую оболочку (exit, когда закончите )и установите ограничение на более низкое значение (100 кбайт):

$ bash
$ ulimit -s 100

В приведенном вами примере может возникнуть ошибка:

$ touch {1..100000}.jpg
bash: /usr/bin/touch: Argument list too long

Но лучше использовать что-то вроде echo. Поймите, что встроенная функция может не вызвать ошибку, эта команда должна работать правильно:

$ echo {000001..100000}6789

Также обратите внимание, что количество байтов значительно превышает предел, установленный выше (1,1 Мбайт):

$ echo {000001..100000}6789 | wc -c
1100000

Но эта команда не работает:

$ /bin/echo {000001..100000}6789
bash: /bin/echo: Argument list too long

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

3
17.06.2020, 12:40
3 ответа

Использование стандартаsed:

$ printf 'XXthisXXisXXjust\nXXa\nXXtest\n' | sed 's/XX/YY/g; s/\(.*\)YY/\1XX/'
YYthisYYisXXjust
XXa
XXtest

Код sedс комментариями:

s/XX/YY/g;              # change all XX to YY
s/\(.*\)YY/\1XX/;       # replace last YY with XX

Эта вторая замена заменит последний YYв модифицированной строке на XX, поскольку .*является жадным.

Если ваш XX— это [1;34m, а YY— это [1;90m, то

sed 's/\[1;34m/[1;90m/g; s/\(.*\)\[1;90m/\1[1;34m/'

Обратите внимание, что [нужно экранировать как \[, если вы хотите сопоставить его в регулярном выражении.

3
18.03.2021, 23:26
  1. Сначала я изменяю все экземпляры XXи заменяю их на YY.

s/XX/YY/g

  1. Затем я заменяю все, что начинается с \nYYна\nXX

s/\\nYY/\nXX/g

  1. Я, наконец, заменил 3-е вхождение YYнаXX

s/YY/XX/3

[root@ServerA studyroom]# echo "XXthisXXisXXjust\nXXa\nXXtest" | sed 's/XX/YY/g;s/\\nYY/\nXX/g;s/YY/XX/3'
YYthisYYisXXjust
XXa
XXtest

Как сказал бы один из моих коллег, все дороги ведут в Рим, и некоторые быстрее, чем другие.

1
18.03.2021, 23:26

С GNU sedиrev:

$ echo "XXthisXXisXXjust\nXXa\nXXtest" | rev | sed 's/XX/YY/2g' | rev
YYthisYYisYYjust\nYYa\nXXtest

$ echo -e "XXthisXXisXXjust\nXXa\nXXtest" | rev | sed 's/XX/YY/2g' | rev
YYthisYYisXXjust
XXa
XXtest

Нет необходимости обращать поиск и замену строк, т.е. XXи YYв данном конкретном случае, поскольку они являются палиндромными.

2
18.03.2021, 23:26

Теги

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