4

Учитывая текстовый файл со строкой, разделенной пробелами, и целым числом, разделенным табуляцией, я бы хотел избавиться от всех слов, которые имеют не-буквенные символы, но оставляют после себя слова, состоящие только из буквенных символов и табуляции плюс целое число.

Мои попытки, подобные приведенным ниже, не принесли никакой пользы. То, что я пытался выразить, это что-то вроде: «замените все, что находится в границах слова, которое начинается и заканчивается 0 или более чем угодно, и есть хотя бы один: digits: или: punct: между».

sed 's/\b.*[:digits::punct:]+.*\b//g'
sed 's/\b.*[^:alpha:]+.*\b//g'

Что мне не хватает? Смотрите пример входных данных ниже.

Спасибо!

Входные данные:

asdf 754m   563  
a2a 754mm   291  
754n    463  
754 ppp 1409  
754pin  4652  
pin pin 462  
754pins 652  
754 ppp </D>    1409  
<D> 754pin  4652  
pi$n pin    462  
754/p ins   652  
754 pp+p    1409  
754 p=in    4652  

Желаемый результат:

asdf    563  
    291  
    463  
ppp 1409  
    4652  
pin pin 462  
    652  
 ppp    1409  
    4652  
 pin    462  
 ins    652  
    1409  
    4652  

3 ответа3

0

Разве это не лучше всего решить с помощью регулярных выражений?

([AZ]+ вкладка [0-9]+ ) или что-то в этом роде

0

Так что, если я правильно понимаю, вы хотите сохранить слова, которые имеют либо все слова, либо все цифры. Но больше ничего, если так, то вот так должно работать

(^|\s+)([A-Za-z]+|\d+)((?=\s)|(?=$))

(Использовать с многострочным флагом)

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

0

В основном это становится длинным списком вещей для удаления:

sed -r 's/(^[[:digit:]]+\b|\b[[:digit:]]+[[:punct:]]*[[:alpha:]]+\b|\b[[:alpha:]]+[[:digit:]]+[[:alpha:]]+\b|\b[[:alpha:]]+[[:punct:]]+[[:alpha:]]+\b|[[:punct:]]+.*[[:punct:]]+)//g' file

Удалить это:

  • цифры в начале строки
  • слова, начинающиеся с цифр, могут включать знаки препинания и заканчиваться буквенными символами
  • слова, которые состоят из альфа-символов, за которыми следуют цифры, за которыми следует альфа
  • слова, которые состоят из альфа, пункт, альфа
  • последовательности, которые начинаются и заканчиваются точечными символами

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .