所以我有一个csv文件:
Today</span><span class='invisible'>3:00 p.m. Nov. 29, 2013
Today</span><span class='invisible'>1:52 p.m. Nov. 29, 2013
Today</span><span class='invisible'>12:50 p.m. Nov. 29, 2013
Today</span><span class='invisible'>11:42 a.m. Nov. 29, 2013
Today</span><span class='invisible'>9:56 a.m. Nov. 29, 2013
Nov. 27, 2013
Nov. 27, 2013
Nov. 27, 2013
Nov. 27, 2013
Nov. 25, 2013
我需要替换以Today
开头的所有行,并将其替换为当前行中的日期。到目前为止,我一直在运行for循环:
rownumber=$(wc -l < DateStamp.csv)
for ((i=1; i<=$rownumber; i++))
do
s1=$(awk -v "row=$i" -F'@' 'NR == row { print $1 }' DateStamp.csv)
if [[ "$s1" =~ 'Today' ]]
then
year=$(date +'%Y')
text=$(awk -v "row=$i" -F'@' 'NR == row { print $1 }' DateStamp.csv | grep -o -P "(?<=m\. ).*(?<=$year)")
__SOME COMMAND__
else
break
fi
done
我希望我的输出是这样的:
Nov. 29, 2013
Nov. 29, 2013
Nov. 29, 2013
Nov. 29, 2013
Nov. 29, 2013
Nov. 27, 2013
Nov. 27, 2013
Nov. 27, 2013
Nov. 27, 2013
Nov. 25, 2013
是否有一行我可以用 SOME COMMAND 代替,它将用我的变量text
替换我所在的行?可能是sed
或awk
命令?
答案 0 :(得分:2)
假设在日期前面存在a.m.
或p.m.
,您真的需要解析并从Today
行中提取日期吗?以下可能就足够了
sed 's/.*[ap]\.m\.\s\+\(.*\)$/\1/' DateStamp.csv
这使用捕获组\(.*\)
来收集a.m
或p.m.
之后的部分,并用此捕获组的内容替换整个输入行。 sed只是通过原始行
答案 1 :(得分:2)
您可以使用awk
awk '/^Today/ {$0=$4 FS $5 FS $6}1' DateStamp.csv
Nov. 29, 2013
Nov. 29, 2013
Nov. 29, 2013
Nov. 29, 2013
Nov. 29, 2013
Nov. 27, 2013
Nov. 27, 2013
Nov. 27, 2013
Nov. 27, 2013
Nov. 25, 2013
如果行以Today
开头,则将行设置为等于字段4,5和6.然后将所有内容打印出来。