Как удалить прямые косые черты, которые являются отдельными, но не являются частью данных?

#sed

#sed

Вопрос:

У меня есть файл, который содержит даты в mm/dd/yyyy формате, но по всему файлу также есть случайные «/», которые необходимо удалить, которые являются отдельными и ни с чем не связаны. Я пробовал sed 's/[/]//g' file.txt , но это удаляет косые черты в дате, создавая mmddyyyy даты, которые нельзя прочитать позже в программе. Я ищу способ удалить случайные косые черты, но сохранить те, которые содержатся в датах.

Файл выглядит следующим образом

 Date           Time    
05/23/2010     12:30    
05/23/2010     1:30    
/     
05/24/2010     1:30
 

И я хочу, чтобы это было

 Date**         Time
05/23/2010     12:30    
05/23/2010     1:30    
05/24/2010     1:30
 

Комментарии:

1. Пожалуйста, покажите надлежащий тестируемый образец с соответствующим ожидаемым результатом, не публикуйте их в виде комментариев или изображений.

2. Вы имеете в виду, что хотите удалить целые строки, которые содержат только a / ? Нравится sed '/^/$/d' file > newfile ?

Ответ №1:

Использовать awk его намного проще:

 awk 'NR == 1 || $1 ~ /^([0-9]{2}/){2}[0-9]{4}$/' file | column -t

Date        Time
05/23/2010  12:30
05/23/2010  1:30
05/24/2010  1:30
 

Здесь:

  • NR == 1 : Возвращает true, если это первая запись
  • || : ИЛИ
  • $1 ~ /^([0-9]{2}/){2}[0-9]{4}$/ : Если первый столбец соответствует заданному формату даты
  • используйте действие по умолчанию для печати совпадающих записей

Ответ №2:

Вы можете удалить все строки, которые содержат только / из файла, используя

 sed '/^/$/d' file > newfile
 

Или, если могут быть начальные / конечные пробелы, '/^[[:blank:]]*/[[:blank:]]*$/d' .

Смотрите онлайн sed -демонстрацию:

 s='05/23/2010 12:30
05/23/2010 1:30
 / 
05/24/2010 1:30'
sed '/^[[:space:]]*/[[:space:]]*$/d' <<< "$s"
 

Вывод:

 05/23/2010 12:30
05/23/2010 1:30
05/24/2010 1:30
 

Ответ №3:

 $ sed -nE  '1p;s/.*([0-9]{2}/[0-9]{2}/[0-9]{4} *[0-9]{1,2}:[0-9]{2}).*/1/p' file
 

Вывод:

 Date           Time    
05/23/2010     12:30
05/23/2010     1:30
05/24/2010     1:30