Как мне поменять две строки с помощью команды sed с разделителем в виде запятой? - PullRequest
0 голосов
/ 05 ноября 2019

это моя первая публикация здесь, поэтому я извиняюсь, если форматирование все странно.

Используя команду sed, я хочу поменять местами x и y с x, y на y, x и сохранитьПоменяйте местами версию в отдельный файл.

Файл, который я должен изменить, содержит,

#######bank info########
#
####name####    ####age####
#
Bob,Stevenson       27
David,Tan           43
Robert,Jackson      39

Я хочу изменить имя с фамилией, фамилией на фамилию, имя.

Я уже пробовал использоватькоманда,

sed -e "s/^\([^#]*\) *\([,]*\)/\2\1/g" file > xxx

Тем не менее, когда я проверяю «поменявшийся» файл, кажется, что ничего не изменилось. Почему?

Ожидаемый вывод:

#######bank info########
#
####name####    ####age####
#
Stevenson,Bob       27
Tan,David           43
Jackson,Robert      39

Но мой вывод:

#######bank info########
#
####name####    ####age####
#
Bob,Stevenson       27
David,Tan           43
Robert,Jackson      39

Что в точности совпадает с исходной версией. Почему это происходит?

Ответы [ 3 ]

0 голосов
/ 05 ноября 2019

Тот же подход, что и у очень хорошего ответа @KamilCuk, но используя расширенные символы регулярных выражений и слов, вы можете сделать

sed -E '/,/s/(\w+),(\w+)/\2,\1/' file > newfile

, где /,/ работает только со строками с ',' и захватомгруппы (\w+) соответствуют группам из одного или нескольких слов-символов. Выражение (\w+),(\w+) гарантирует, что две группы слов-символов разделены запятой, а затем \2,\1 просто вставляет обратные ссылки в обратном порядке, например,

Пример использования / Вывод

$ sed -E '/,/s/(\w+),(\w+)/\2,\1/' file
#######bank info########
#
####name####    ####age####
#
Stevenson,Bob       27
Tan,David           43
Jackson,Robert      39
0 голосов
/ 05 ноября 2019

Если вы можете использовать awk, это подойдет.

awk -F'[ ,]+' '/,/{$0=$2","$1"\t"$3}1' file
#######bank info########
#
####name####    ####age####
#
Stevenson,Bob   27
Tan,David       43
Jackson,Robert  39

Может быть немного проще понять awk по сравнению с sed:)

  • -F'[ ,]+' Разделить строку одной или несколькими запятыми или пробелом
  • /,/ для строк с запятой:
  • $0=$2","$1"\t"$3 восстановить строку в новом порядке с запятой и символом табуляции
  • 1 всегда true, выполнить действие по умолчанию, напечатать строку.
0 голосов
/ 05 ноября 2019
sed '
   # only lines that do not start with a #
   /^#/!{
     # match from the start
     # match up until a comma
     # then match the comma
     # then match up until a space
     # swap the part before the comma and after comma
     s/^\([^,]*\),\([^ ]*\)/\2,\1/
   }

'

И немного более короткая версия:

sed '/^#/!s/^\([^,]*\),\([^ ]*\)/\2,\1/'
...