Как удалить все (в каждой строке) в текстовом файле после шаблона символов (включая шаблон)?

Как удалить все (в каждой строке) в текстовом файле после шаблона символов (включая шаблон)?

По сути, мне нужно то, что получил автор этого вопроса, но не захотел. Как удалить все после определенного шаблона или строки в файле?

Итак, я получил такие данные:

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$ 

Связанный контент