Bash脚本正则表达式...如何查找和替换所有匹配?

Jos*_*osh 9 regex bash shell search replace

我正在编写一个逐行读取文件的bash脚本.

该文件是.csv文件,其中包含DD/MM/YYYY格式的许多日期,但我想将它们更改为YYYY-MM-DD.

我想使用正则表达式匹配数据,并替换它,使文件中的所有日期都正确格式化为YYYY-MM-DD.

我相信这个正则表达式会匹配日期:

([0-9][0-9]?)/([0-9][0-9]?)/([0-9][0-9][0-9][0-9])
Run Code Online (Sandbox Code Playgroud)

但我不知道如何找到正则表达式匹配并用新格式替换它们,或者甚至可以在bash脚本中使用它.请帮忙!

anu*_*ava 22

尝试使用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
Run Code Online (Sandbox Code Playgroud)

PS:在Mac上使用sed -E而不是sed -r


Fri*_*ner 16

纯粹的狂欢.

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"
Run Code Online (Sandbox Code Playgroud)

输入文件

xxxxxxxxx,11/03/2011,yyyyyyyyyyyyy          
xxxxxxxxx,10/04/2011,yyyyyyyyyyyyy          
xxxxxxxxx,10/05/2012,yyyyyyyyyyyyy          
xxxxxxxxx,10/06/2011,yyyyyyyyyyyyy          
Run Code Online (Sandbox Code Playgroud)

给出以下输出:

xxxxxxxxx,2011-03-11,yyyyyyyyyyyyy
xxxxxxxxx,2011-04-10,yyyyyyyyyyyyy
xxxxxxxxx,2012-05-10,yyyyyyyyyyyyy
xxxxxxxxx,2011-06-10,yyyyyyyyyyyyy
Run Code Online (Sandbox Code Playgroud)


sve*_*rre 2

你可以使用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/'
Run Code Online (Sandbox Code Playgroud)