Bash:从CSV文件

时间:2017-02-28 16:38:04

标签: bash

我有几百行的CSV文件,这些行中有很多(不是全部)包含我要提取的数据(Klas / Lesgroep:;; T2B1)。 即 ;;;;;; Klas / Lesgroep:;; T2B1 ;;;;;;;;;;;

我想删除Klas / Lesgroep前面的分号,但分号的数量是可变的。如何在Bash中删除这些分号?

我不是英语本地人,所以我希望你能清楚

3 个答案:

答案 0 :(得分:1)

使用sed,您可以搜索以至少一个分号后跟Klas/Lesgroep开头的行,如果找到,则无需替换前导;

$ sed '/;;*Klas\/Lesgroep/s/^;*//g' <<< ";;;;;;Klas/Lesgroep:;;T2B1;;;;;;;;;;"
Klas/Lesgroep:;;T2B1;;;;;;;;;;

答案 1 :(得分:1)

删除任何非空的;个字符。直接来自文字Klas/Lesgroep

使用GNU或BSD / macOS sed

$ sed -E 's|;+(Klas/Lesgroep)|\1|' <<< ";;;;;;Klas/Lesgroep:;;T2B1;;;;;;;;;;"
Klas/Lesgroep:;;T2B1;;;;;;;;;;
  • s函数执行字符串替换(替换):

    • 第一个参数是正则表达式(正则表达式),用于指定要匹配的行的哪个部分,
    • 和第二个参数指定用。替换匹配部分的内容。
    • 请注意我是如何选择|作为正则表达式/参数分隔符而不是习惯/,因为这样可以未转义使用/个字符。 里面正则表达式。
  • ;+匹配一个或多个直接相邻的;字符。

  • (Klas/Lesgroep)与文字Klas/Lesgroep匹配并将其封装在(...)中 - 使其成为捕获组 - 记住匹配并可以引用as \1 - 正则表达式中的第一个捕获组 - 位于s替换参数中。

净效应是所有;个字符。 Klas/Lesgroep之前的已移除

POSIX兼容表格:

$ sed 's|;\{1,\}\(Klas/Lesgroep\)|\1|' <<< ";;;;;;Klas/Lesgroep:;;T2B1;;;;;;;;;;"
Klas/Lesgroep:;;T2B1;;;;;;;;;;

POSIX需要功能较弱且过时的BRE syntax,其中必须将复制符号+模拟为\{1,\},并且通常需要模仿元字符(){}必须\ - 转义。

答案 2 :(得分:0)

删除所有“;”从文件中,我们可以使用sed命令。 sed用于修改文件。

$ sed 's/find/replace/g' file

替换标志/ g(全局替换)指定sed命令来替换行中所有出现的字符串。

所以删除“;”只需找到并替换它。

sed 's/;//g' file.csv