【问题标题】:Removing spaces from the fields in a pipe-delimited file using shell script使用 shell 脚本从管道分隔文件中的字段中删除空格
【发布时间】:2011-11-04 05:11:50
【问题描述】:

我是 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' 文件名 > testOP

pipeline('|') 是我文件中的分隔符。我需要删除管道前后的空格,但需要保留单词之间的空格,例如:“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||

非常感谢任何帮助。

谢谢, 萨维塔

【问题讨论】:

    标签: shell sed


    【解决方案1】:

    使用:

    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
    

    【讨论】:

    • 显然他的sed 想要管道反斜杠转义。
    • 我把它作为 sed -e 's/ *\| */\|/g' 文件名。但我仍然在输出中有不需要的空格。
    • @Savitha 是否有其他形式的空白要删除,或者只是问题中所述的空格?
    • @Michael:对不起,如果这是一个愚蠢的问题。但是其他形式的空白是什么?
    • @Savitha 一点也不傻。空白是指没有打印表示的字符,而是用于其他单词之间的间距。为了在 sed 中处理行,相关的是空格和制表符。其他形式的空格在更一般的情况下是相关的,例如,可以包含多行的字符串将换行符作为空格。
    【解决方案2】:

    这可能有效:

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

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

    【讨论】:

    • 我尝试了您的解决方案,但我的输出中仍然有空格。
    • 它们是空格还是空行?如果后者在上面的命令前面加上/^$/d;
    • 我相信,它的“tab(Chr(9))”没有被删除。
    【解决方案3】:

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

    sed -e 's/ *\|/\|/g' -e 's/press_tab_key_here*\|press_tab_key_here*/\|/g' -e 's/\| */\|/g' 文件名

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

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

    【讨论】:

      【解决方案4】:

      在这里考虑逗号作为数据列的 csv 或文本文件中的分隔符是一种删除前导尾随的方法,使空格成为单一的。

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

      【讨论】:

        猜你喜欢
        • 2021-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-08
        • 2018-03-17
        • 1970-01-01
        相关资源
        最近更新 更多