让我们努力实现sed命令
让我们考虑这样CSV文件与以下内容:
$ cat file
Solaris,25,11
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
- 删除第1段或列:
$ sed 's/[^,]*,//' file
25,11
31,2
21,3
45,4
12,5
这经常表达的搜索顺序的非逗号([^,]*)人物和将其删除,其结果在第1段得到清除。
- 只打印的最后一个领域,或除外的所有领域的最后一个领域:
$ sed 's/.*,//' file
11
2
3
4
5
这regex消除一切直到最后一个逗号(.*,) 其结果中删除所有领域,除了最后一个领域。
- 只打印第1栏:
$ sed 's/,.*//' file
Solaris
Ubuntu
Fedora
LinuxMint
RedHat
这regex(,.*) 删除的字符从第1逗号,直到结束导致删除所有领域,除了最后一个领域。
- 删除第2栏:
$ sed 's/,[^,]*,/,/' file
Solaris,11
Ubuntu,2
Fedora,3
LinuxMint,4
RedHat,5
Regex(,[^,]*,)搜索一个逗号和序列的字符后加一个逗号,其结果匹配的第2列,并取代这一模式匹配的只有一个逗号,最终结束在删除第2列。
注:删除该领域中变得更加强硬,在sed由于每一个领域都有配字面上。
- 只打印第2栏:
$ sed 's/[^,]*,\([^,]*\).*/\1/' file
25
31
21
45
12
Regex匹配的第一个领域,第二领域和其余部分,然而组第2段单独的。 整个线是现在替换第2段(\1),因此只有第2段得到显示。
- 只打印线在最后一栏是一个单一的数字数:
$ sed -n '/.*,[0-9]$/p' file
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
Regex(,[0-9]$)检查单位,在最后的领域和p命令指纹的线这符合这一条件。
- 到数字中的所有行的文件:
$ sed = file | sed 'N;s/\n/ /'
1 Solaris,25,11
2 Ubuntu,31,2
3 Fedora,21,3
4 LinuxMint,45,4
5 RedHat,12,5
这是模拟猫-n命令。 awk且它容易使用特殊的可变NR。 该'='的命令sed给线路数量的每一个线随后通过的行本身。 Sed输出是通过管道输送到另一个sed命令参加每2线。
- 将最后一领域通过99如果第1段是'Ubuntu':
$ sed 's/\(Ubuntu\)\(,.*,\).*/\1\299/' file
Solaris,25,11
Ubuntu,31,99
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
这regex匹配'Ubuntu'和直到结束,除了最后一栏和组,他们每个人。 在更换部分,第1和第2小组沿用新的编号99被取代。
- 删除第2段,如果第1段是'RedHat':
$ sed 's/\(RedHat,\)[^,]*\(.*\)/\1\2/' file
Solaris,25,11
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,,5
第1场'RedHat',第2段和剩余的领域进行分组,并更换做是只有第1次和最后一组,resuting在得到第2段删除。
- 插入一个新的栏在结束(最后一列):
$ sed 's/.*/&,A/' file
Solaris,25,11,A
Ubuntu,31,2,A
Fedora,21,3,A
LinuxMint,45,4,A
RedHat,12,5,A
Regex(.*) 与整个线和替换它的行本身(&)和新的领域。
- 插入一个新列在开始(第1栏):
$ sed 's/.*/A,&/' file
A,Solaris,25,11
A,Ubuntu,31,2
A,Fedora,21,3
A,LinuxMint,45,4
A,RedHat,12,5
同样,作为最后一个例子,只是线匹配之后是新的列
我希望这将有所帮助。 让我知道如果你需要使用Awk或任何其他命令。
谢谢你
sed -Ei "$rownum s/$newvalue/$col" file.csv
它扔了一个错误,但想知道更多关于这一点。 任何资源来阅读时将是有帮助的。