简体   繁体   English

用SED或AWK(或任何可行的方式)替换日期-Linux正则表达式

[英]Replacing dates with SED or AWK (or whatever works) - Linux regex

I would like convert: 我想转换:

Charlie answered 9 years ago
random text
Kevin answered 4 months ago

To this: 对此:

Charlie answered around March 2006
random text
Kevin answered around November 2014

Using the following code: 使用以下代码:

date "+%B %Y" --date="9 years ago"

is where I got March 2006 from. 是我2006年3月从那里得到的。

Should I use a for loop since I will be using instances where there will be 10+ dates that say "answered ______ ago" 我是否应该使用for循环,因为我将使用实例,其中将有10个以上的日期表示“在______之前答复”

Which program is recommended? 推荐哪个程序? Sed, awk, any more? Sed,awk,还有吗?

Thank you, I am doing this for a Professor who wants to do research on the accuracy of Yahoo Answers, and I will really appreciate your help. 谢谢您,我正在为一位希望对Yahoo Answers的准确性进行研究的教授而做,我将非常感谢您的帮助。

$ cat tst.awk         
/answered/ && match($0,/[0-9]+[[:space:]]+[[:alpha:]]+[[:space:]]+ago/) {
    cmd = "date \"+%B %Y\" --date=\"" substr($0,RSTART,RLENGTH) "\""
    if ( (cmd | getline date) > 0 ) {
        $0 = substr($0,1,RSTART-1) "around " date
    }
    close(cmd)
}
{ print }

$ awk -f tst.awk file
Charlie answered around March 2006
random text
Kevin answered around November 2014

Doing it in BASH: 用BASH进行:

while read -r line; do
   [[ $line != *answered* ]] && echo "$line" && continue
   date "+${line/answered */answered} around %B %Y" -d "${line#* answered }"
done < file

Output: 输出:

Charlie answered around March 2006
random text
Kevin answered around November 2014

Here is one more awk 这是另外一个awk

awk -F"answered " 'NF>1{"date \"+%B %Y\" --date=\""$2"\"" | getline t;$2=FS "around "t}1' file
Charlie  answered around March 2006
random text
Kevin  answered around November 2014

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM