2011-01-14 1 views
2

"date = month_name DD, YYYY"및 "date = (month_name DD, YYYY)"형식의 텍스트 파일이 있습니다. "날짜를 (month_name DD, YYYY)에서 (YYYY-MM-DD)로 변환하는 스크립트

이 날짜를"date = YYYY-MM-DD "형식으로 변환하려면 어떻게해야합니까?

필드 이름 앞에 "accessdate ="또는 필드 이름이없는 날짜도 있습니다. 변환하려는 날짜가 있습니다.

감사합니다.

칙 :

  • 달 이름은 전체 영어 월 이름이 들어 있습니다된다 1 월, 2 월 등
  • ref 태그 안의 날짜 만 변환하면 내부에 다른 텍스트로 둘러싸여 있습니다. <ref></ref>'
  • 스크립팅을위한 언어는 개방되어 있습니다. 나는 작은 bash, 자바 스크립트 & 파이썬을 했어. 하지만 awk, sed, perl 등도 괜찮을 것이라고 생각합니다. 코드에 대한 설명이 감사하겠습니다.
+0

사용하는 lanugage에 대한 선호 사항이 있습니까? 이것은 PHP, 쉘 스크립트, 파이썬 또는 다른 것입니까? – Spudley

+0

또한 월 이름이 길거나 짧습니까? (또는 둘의 혼합?) 영어로되어 있습니까? – Spudley

+0

쉘 또는 Perl입니까? – tchrist

답변

0

당신은

echo 'date=April 13, 1985' | sed -e 's/January/01/' ... \ 
     -e 's/April/04/' ... -e 's/December/12/' | \ 
    sed 's/\([0-9]*\)[^0-9]\([0-9]*\)[^0-9] \([0-9]*\)$/\1-\2-\3/' 

처리하려면 "날짜 = (MONTH_NAME DD, YYYY)"당신은 또한 파이프에 sed 's/date=(\([^(]*\))/date=\1/'를 추가하고 등등 수와 함께 시작할 수 있습니다.

추가 정보. sed는 <ref></ref> 태그로 작업하는 데 충분하지 않습니다. 따라서 더 강력한 것을 사용해야합니다. 예 : 파이썬.

re.search()<ref>이고 일치는 </ref>입니다. 그러면 re.match()은 sed에서 사용 된 것과 유사한 정규 표현식을 사용하여 내부의 내용을 변환하는 데 사용할 수 있습니다. 이 알고리즘은 while 루프로 묶여 모든 문서를 탐색해야합니다.

+0

힌트를 보내 주셔서 감사합니다. re.search와 re.match를 사용하여 제안한 방법을 시도해 보겠습니다. – ylivuoto

+0

위 코드에서 달 이름을 파싱 할 때 각 -e 앞에 "| sed"를 넣어야하고 마지막에 \ 3- \ 1- \ 2 /가되어야 yyyy- mm-dd 형식. – ylivuoto

+0

사실 나는 "sed"를 넣을 필요가 없었습니다. 다른 줄에 코드를 나누기 위해 '\'뒤에 공백이 있기 때문에 오류가있었습니다. – ylivuoto

0

사용하는 도구에 따라 다릅니다.

예. 당신이 이런 식으로 뭔가를 할 수 나오지 AWK &로 :

awk '{ 
     /date=(?Jan/ {print "s/\\(.\\+\\)date=(\\?month_name \\(\\d\\d\\), \\(\\d\\d\\d\\d\\))\\?\\(\.\\+\\)$/\\1date=\\3-01-\\2\\4"} 
     /date=(?Feb/ {print "s/\\(.\\+\\)date=(\\?month_name \\(\\d\\d\\), \\(\\d\\d\\d\\d\\))\\?\\(\.\\+\\)$/\\1date=\\3-02-\\2\\4"} 
     /date=(?Mar/ {print "s/\\(.\\+\\)date=(\\?month_name \\(\\d\\d\\), \\(\\d\\d\\d\\d\\))\\?\\(\.\\+\\)$/\\1date=\\3-03-\\2\\4"} 
     # ... 
}' INPUT_FILE > tmp.sed 

그런 다음 당신은

sed -i.ORIG -f tmp.sed INPUT_FILE 

을 수행 할 수 있습니다 또는 당신은 $ 0 구문 분석, 순수 AWK에 쓸 수 있습니다.