%20%D0%B2%20%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%BC%20%D1%84%D0%B0%D0%B9%D0%BB%D0%B5%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%20%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B0%20%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D0%BE%D0%B2%20(%D0%B2%D0%BA%D0%BB%D1%8E%D1%87%D0%B0%D1%8F%20%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD)%3F.png)
По сути, мне нужно то, что получил автор этого вопроса, но не захотел. Как удалить все после определенного шаблона или строки в файле?
Итак, я получил такие данные:
Something and something ........................... 23
Another one .......................................123
Somethingelse Inc. .................................243
Поэтому я хочу удалить всю кучу точек (и цифр) после пробела.
До сих пор я пытался использовать команду OP, но она не сработала так, как я ожидал, потому что она удаляет все после первой точки, с которой сталкивается. Это означает, что точка в данных типа Somethinelse Inc. также удаляется.
Я попытался заставить работать первый (sed) ответ из этого вопроса, заменив первый .com на три точки, а второй на пустой пробел, но у меня ничего не получилось. На этот раз все после первого пробела удалено или осталось три точки.
Второй ответ (ex -sc ...) сработал так, как и хотел автор, но он оставил несколько точек, поэтому мне с ним тоже не повезло.
Я также попытался подправить команду из этого ответа, но и это не удалось.Как удалить из строки все до шаблона и все после другого шаблона?
решение1
sed 's/ \.\..*$//' /path/to/file
должно сработать:
\.\. - A space followed by two literal periods
.* - One or characters of any type
$ - End of line
решение2
Другим, хотя и неэлегантным решением может быть:
cat path/to/yourfile | sed -E "s/[\.]{2,}//g" | sed "s/[0-9]//g" > path/to/new_file
где:
-E
Интерпретировать регулярные выражения как расширенные (современные) регулярные выражения[\.]{2,}
сопоставить точку в двух или более случаях[0-9]
сопоставить все цифрыs/expr//g
означает заменитьexpr
ничем не сопоставленным столько, сколько сможете (г)
решение3
Как насчет этого:
sed 's/\.\+ *[[:digit:]]\+[[:space:]]*$//g'
что значит:
один+ко+многим(\+)точки(\.)И от нуля до многих(*)пространства( )И один+ко+многим(\+) цифры([[:цифра:]])И на всякий случай любой(*) пробел ([[:космос:]])И Конец этой строки ($)
Протестировано с помощью (обратите внимание, что я вставил «...234» во 2-й строке и завершающие символы табуляции/пробелы):
Something and something ........................... 23<Tab>
An ...234 other one .......................................123<space>
Somethingelse Inc. .................................243<some spaces>
И вот результат:
xb@dnxb:/tmp$ sed 's/\.\+ *[[:digit:]]\+[[:space:]]*$//g' sample.txt
Something and something
An ...234 other one
Somethingelse Inc.
xb@dnxb:/tmp$