使用shell脚本从管道分隔文件中的字段中删除空格

时间:2011-11-04 05:11:51

标签: shell sed

我是UNIX Shell脚本的新手。

我需要帮助从字段中删除前导和尾随空格。但我需要保留单词之间的空格。

请查看下面的数据示例和所需结果,以了解我的问题。

数据样本:

1-B48980007       |82984788|317      |ALQ|     |4423271    |              0|  |

I0000000000000000000245729|28887957|IL FR    |   |     |00000000573|              0|  |

I0000000000000000000245715|13822348|RPVIPPR  |   |     |00000000298|              0|  |

I0000000000000000000245721|15348717|AN BV    |   |     |00000001526|              0|  |

期望的结果:

1-B48980007|82984788|317|ALQ||4423271|0||

I0000000000000000000245729|28887957|IL FR|||00000000573|0||

I0000000000000000000245715|13822348|RPVIPPR|||00000000298|0||

I0000000000000000000245721|15348717|AN BV|||00000001526|0||

但是我使用以下命令得到如下输出:

sed's / * \ | / \ | / g'file_name> testOP

管道('|')是我文件中的分隔符。我需要删除管道前后的空格,但需要保留单词之间的空格,例如:“IL FR”和“AN BV”。

1-B48980007     |82984788|317|ALQ||4423271|           0||

I0000000000000000000245729|28887957|IL FR|  ||00000000573|            0||

I0000000000000000000245715|13822348|RPVIPPR|    ||00000000298|            0||

I0000000000000000000245721|15348717|AN BV|  ||00000001526|            0||

非常感谢任何帮助。

谢谢, Savitha

4 个答案:

答案 0 :(得分:10)

使用:

sed -e 's/ *| */|/g' file_name

给出了期望的结果:

1-B48980007|82984788|317|ALQ||4423271|0||

I0000000000000000000245729|28887957|IL FR|||00000000573|0||

I0000000000000000000245715|13822348|RPVIPPR|||00000000298|0||

I0000000000000000000245721|15348717|AN BV|||00000001526|0||

请注意,此方法仅删除空格字符。要排除所有空格,还必须考虑制表符。对于任何符合POSIX标准的sed实现,您可以这样做:

sed -e 's/[[:space:]]*|[[:space:]]*/|/g' file_name

或者,使用正则表达式的GNU扩展:

sed -e 's/\s*|\s*/|/g' file_name

答案 1 :(得分:1)

这可能有效:

sed 's/\s*|\s*/|/g' input_file

编辑:删除了不必要的parens和替换

答案 2 :(得分:1)

我用下面的sed语句解决了这个问题:

sed -e 's/ *\|/\|/g' -e 's/press_tab_key_here*\|press_tab_key_here*/\|/g' -e 's/\| */\|/g' file_name

要删除制表符空格,我不得不按“制表符”键。 '\ t'在我的情况下不起作用。

感谢Michael,Potong和Triplee的所有帮助和支持。 :)

答案 3 :(得分:-1)

将逗号视为csv中的分隔符或数据列的文本文件,这里是一个删除前导尾部,使空格单。

cat filename.txt | fmt -su | sed 's/^ *//g' | sed 's/ *$//g' | sed 's/ ,/,/g' | sed 's/, /,/g'