Regex vim&;csv文件:将标题信息放入新列

Regex vim&;csv文件:将标题信息放入新列,regex,vim,csv,replace,copy-paste,Regex,Vim,Csv,Replace,Copy Paste,我有大量csv文件,如下所示: xxxxxxxx xxxxx 装运,YD564n xxxxxxxxx xxxxx 1,RR1760 2,HI3503 3,HI4084 1824年11月4日 我需要使它们看起来如下所示: xxxxxxxx xxxxx 装运,YD564n xxxxxxxxx xxxxx YD564n,1,RR1760 YD564n,2,HI3503 YD564n,3,HI4084 YD564n,4,HI1824 YD564n是一个装运编号,每个csv文件的装运编号都不同。但

我有大量csv文件,如下所示:


xxxxxxxx
xxxxx
装运,YD564n
xxxxxxxxx
xxxxx

1,RR1760
2,HI3503
3,HI4084
1824年11月4日


我需要使它们看起来如下所示:


xxxxxxxx
xxxxx
装运,YD564n
xxxxxxxxx
xxxxx

YD564n,1,RR1760
YD564n,2,HI3503
YD564n,3,HI4084
YD564n,4,HI1824


YD564n是一个装运编号,每个csv文件的装运编号都不同。但它总是在“发货”之后出现


我可以使用什么vim命令?

在一个文件中,在正常模式下键入以下命令:

qqgg/^Shipment,<CR>ww"ay$}j:.,$s/^/<C-R>a,<CR>q
qqgg/^shipping,ww“ay$}j:,$s/^/a,q
请注意,
是回车键,
是CTRL-R

这将更新该文件并在寄存器q中重新创建命令


然后在另一个文件中键入@q(也在正常模式下)。(这将回放寄存器q)

这可以作为Perl一行程序来完成:

perl -i.bak -e' $c = do {local $/; <>};
                ($n) = ($c =~ /Shipment,(\w+)/);
                $c =~ s/^(\d+,)/$n,$1/gm;
                print $c' shipment.csv

好吧,不要抨击我,但是…你可以考虑:不要在vim中这样做

这是脚本语言的经典用法示例。 以基本的python、perl或ruby教程为例 在里面

这方面的正则表达式可能不太难,在vim中是可行的。 但还有更容易的选择。
还有更灵活的方法。

您可以使用宏并将其应用于多个文件

以下是一个示例。按原样键入以下内容:

3gg$"ayiw:6,$s/^/<C-R>a/<CR>:w<CR>:bn<CR>
然后,如果您有200个csv文件,您可以按如下方式打开vim

vim *.csv
然后

200<C-A>
200
在那里键入Ctrl-A,应该全部完成

这就是说,使用合适的脚本语言,我肯定会更轻松,它会更简单。

为什么使用vim

尝试以下shell脚本:

#!/bin/sh

input=$1

shipment=`grep Shipment $input|awk -F, '{print $2}'`

mv $input $input.orig

sed -e "s/^\([0-9]\)/$shipment,\1/" $input.orig > $input
您可以遍历特定文件:

for input in *.txt
do
    script.sh $i
done

我还认为这不太适合vim,不如换成Bash

FILENAME='filename.csv' && SHIPMENT=`grep Shipment $FILENAME | sed 's/^Shipment,//'` && cat $FILENAME | sed "s/^[0-9]/$SHIPMENT,&/" > $FILENAME
for input in *.txt
do
    script.sh $i
done
FILENAME='filename.csv' && SHIPMENT=`grep Shipment $FILENAME | sed 's/^Shipment,//'` && cat $FILENAME | sed "s/^[0-9]/$SHIPMENT,&/" > $FILENAME