Bash在模式匹配上拆分字符串

时间:2015-11-19 17:36:10

标签: bash awk sed

我有

等数据
ID | Name | Grade
1|Robin Hood so hood | A
2|Gwen Stack DO Rick Stacy |C
3|Bling s/o Peter| A

如果是儿子,DO是女儿,S / O是儿子。

我注视着如何到达

     ID | Name | Grade
    1|Robin Hood| A
    2|Gwen Stack  |C
    3|Bling| A

到最后,我会将这些家伙邮寄到那些我不愿意提供完整字符串的名字

我试图使用while循环,使用awk将第二个字段放入数组然后循环到数组,这是不可靠的

任何SED或AWK方法??

4 个答案:

答案 0 :(得分:3)

您可以使用此sed命令:

sed -i.bak 's~ [sSdD]/*[oO] [^|]*~~' file
ID | Name | Grade
1|Robin Hood|A
2|Gwen Stack|C
3|Bling|A

或使用awk

awk -F ' [sSdD]/?[oO] [^|]*' '{print $1 $2}' file
ID | Name | Grade
1|Robin Hood|A
2|Gwen Stack|C
3|Bling|A

答案 1 :(得分:0)

SED

update.js.erb

答案 2 :(得分:0)

awk '{sub(/s\/o Peter/,"")}{sub(/d \| A/,"\ |A")}NR>1{print $1,$2, $NF}NR==1' file
ID | Name | Grade
1|Robin Hood |A
2|Gwen Stack |C
3|Bling | A

答案 3 :(得分:0)

这个答案应该直截了当,因为它使用 | 作为字段分隔符,而 sub 仅适用于第二个字段。通过在 sub <中创建正则表达式,它还确保 so DO s / o 与名称分开/ strong>考虑三者两边的空格:

awk 'BEGIN {OFS=FS="|"} sub(/ (s\/?o|DO) .*/, "", $2) + 1' file
ID | Name | Grade
1|Robin Hood| A
2|Gwen Stack|C
3|Bling| A

另一件事 - 从你问题的中间部分看,你可能想要不区分大小写。如果您有 gawk ,则可以使用 IGNORECASE 。否则,这是编辑的正则表达式。

awk 'BEGIN {OFS=FS="|"} sub(/ ([Ss]\/?|[Dd])[Oo] .*/, "", $2) + 1' file

如果你想接受不区分大小写的 D / O ,那么这是一个。

awk 'BEGIN {OFS=FS="|"} sub(/ [SsDd]\/?[Oo] .*/, "", $2) + 1' file