Регулярные выражения Bash Script ... Как найти и заменить все совпадения? - PullRequest
9 голосов
/ 14 апреля 2011

Я пишу bash-скрипт, который читает файл построчно.

Файл представляет собой файл .csv, который содержит много дат в формате ДД / ММ / ГГГГ, но я хотел бы изменить их на ГГГГ-ММ-ДД.

Я бы сопоставил данные с помощью регулярного выражения и заменил его так, чтобы все даты в файле были правильно отформатированы как ГГГГ-ММ-ДД.

Я полагаю, что это регулярное выражение будет соответствовать датам:

([0-9][0-9]?)/([0-9][0-9]?)/([0-9][0-9][0-9][0-9])

Но я не знаю, как найти совпадения регулярных выражений и заменить их новым форматом, или если это вообще возможно в скрипте bash. Пожалуйста, помогите!

Ответы [ 3 ]

21 голосов
/ 14 апреля 2011

Попробуйте это с помощью sed:

line='Today is 10/12/2010 and yesterday was 9/11/2010'
echo "$line" | sed -r 's#([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})#\3-\2-\1#g'

OUTPUT:
Today is 2010-12-10 and yesterday was 2010-11-9

PS: на Mac используйте sed -E вместо sed -r

16 голосов
/ 14 апреля 2011

Pure Bash.

infile='data.csv'

while read line ; do
  if [[ $line =~ ^(.*),([0-9]{1,2})/([0-9]{1,2})/([0-9]{4}),(.*)$ ]] ; then
    echo "${BASH_REMATCH[1]},${BASH_REMATCH[4]}-${BASH_REMATCH[3]}-${BASH_REMATCH[2]},${BASH_REMATCH[5]}"
  else
    echo "$line"
  fi
done < "$infile"

Входной файл

xxxxxxxxx,11/03/2011,yyyyyyyyyyyyy          
xxxxxxxxx,10/04/2011,yyyyyyyyyyyyy          
xxxxxxxxx,10/05/2012,yyyyyyyyyyyyy          
xxxxxxxxx,10/06/2011,yyyyyyyyyyyyy          

дает следующий вывод:

xxxxxxxxx,2011-03-11,yyyyyyyyyyyyy
xxxxxxxxx,2011-04-10,yyyyyyyyyyyyy
xxxxxxxxx,2012-05-10,yyyyyyyyyyyyy
xxxxxxxxx,2011-06-10,yyyyyyyyyyyyy
2 голосов
/ 14 апреля 2011

Вы можете сделать это, используя sed

echo "11/12/2011" | sed -E 's/([0-9][0-9]?)\/([0-9][0-9]?)\/([0-9][0-9][0-9][0-9])/\3-\2-\1/'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...