LINUX.ORG.RU

Редактирование текста.

 , ,


0

2

Как в файле оставить только те символы, которые находятся между первым совпадением двух заранее заданных наборов символов? Т.е. если был дан первый набор (7q и второй a'8! и дана строка

a\'23ffd^(7q321a'8!sd5&q](7qerta'8!
должна остаться строка
321

а, это, Bash-ёвые подписать, можно?/

$include/etc/inputrc

«>>>»: «| ferris-redirect »

«>>|»: «| ferris-redirect -T »

#или там это не прицепляется(?).

anonymous
()

Как то так

$ cat s1.txt 
a\'23ffd^(7q321a'8!sd5&q](7qerta'8!
a\'23ffd^(7qkokokoa'8!sd5&q](7qerta'8!

$ sed -i 's_a'\''8!.*__;s_.*(7q__' s1.txt

$ cat s1.txt 
321
kokoko
justAmoment ★★★★★
()
Ответ на: комментарий от Deleted

С примером

a\'23ffd^(7q321a'8!sd5&q](7qerta'8!
правильно работает, но не с
(7qa\'23ffd^(7q321a'8!sd5&q](7qerta'8!
, т.е. где первый набор два раза встречается, до второго набора символов.

antoshka117
() автор топика
Ответ на: Как то так от justAmoment

Спасибо! Проверял в разных ситуациях, не нашёл ни одного случая, где некорректно бы сработал. Осталось лишь разобраться, что означают все те символы и как поменять наборы на другие.

antoshka117
() автор топика
Ответ на: комментарий от antoshka117

Там всё просто:

  1. s_x_y_ то же самое, что и s/x/y/ — заменить x на y, просто через подчеркивание для меня лучше видно что там написано;
  2. две команды замены подряд:
    1. s_a'\''8!.*__; — отрезать всё справа от твоего правого маркера;
    2. s_.*(7q__ — отрезать всё слева от твоего левого маркера;
  3. .* — любые символы;
  4. '\'' — это просто экранированная одна кавычка, потому что без экранирования её внутри нельзя писать.
justAmoment ★★★★★
()

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

$ cat s1.txt 
a\'23ffd^(7q321a'8!sd5&q](7qerta'8!
a\'23ffd^(7qkokokoa'8!sd5&q](7qerta'8!

$ sed -i 's_a'\''8!_a'\''8!\n_g;' s1.txt 

$ cat s1.txt 
a\'23ffd^(7q321a'8!
sd5&q](7qerta'8!

a\'23ffd^(7qkokokoa'8!
sd5&q](7qerta'8!

$ sed -i 's_a'\''8!.*__;s_.*(7q__;/^$/d' s1.txt 

$ cat s1.txt 
321
ert
kokoko
ert

justAmoment ★★★★★
()
Ответ на: комментарий от justAmoment

Заметил одну проблему. Если в файле несколько строк то строки, где нету такого совпадения, остаются не тронутыми. Объединение с помощью

cat file1 | tr -d '\n' > file2
не помогает. В чём может быть проблема?

antoshka117
() автор топика
Ответ на: комментарий от justAmoment

Решил с помощью grep находить строки в которых встречаются оба этих маркера и писать в файл, затем брать первую строку из полученного файла и вырезать нужный кусок. Но, столкнулся с тем, что удаляются все символы только до иероглифов и алфавита эсперанто(за ними не удаляются). Т.е. из

asdf(7q123a'8!ĥqwer
получаем
123ĥqwer

antoshka117
() автор топика
Ответ на: комментарий от justAmoment

Всё, спасибо. Проблема решилась сменой кодировки.

antoshka117
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.