【问题标题】:how to delete | between multiple back backslash(s)如何删除 |在多个反斜杠之间
【发布时间】:2013-01-24 13:34:51
【问题描述】:

我之前在这里也有过类似的问题,但这次对我来说更具挑战性,我只需要删除 |在名称“\WAPNER| john | M\”之间

删除反斜杠也将是一个加号。

文件

10.46|5060|100002366551140|\WAPNER| john | M\ |100002366551750

期望的输出

 10.46|5060|100002366551140|\WAPNER john  M\ |100002366551750

如果您的解决方案也适用于带有单斜杠的名称,那将是完美的 :)

 10.46|5060|100002366551140|\WAPNER|  M\ |100002366551750

输出将是

 10.46|5060|100002366551140|\WAPNER M\ |100002366551750

谢谢

【问题讨论】:

  • 你已经问过这个earlier today。那里的答案有帮助吗?如果没有,您可以评论和编辑您的问题,而不是创建副本。

标签: bash shell sed awk


【解决方案1】:

这可能对你有用(GNU Sed):

sed -r '/\\[^\\]*\\/{s//\n&\n/;h;s/[\\|]//g;G;s/.*\n(.*)\n.*\n(.*)\n.*\n/\2\1/}' file

【讨论】:

    【解决方案2】:

    试试这个

    awk -F '\\'  '{ gsub("|", "", $2); print $0 }'  inputfile > newfile
    

    【讨论】:

    • 这也适用于有 2 个斜杠的名称吗?示例 \WAPNER |米\
    • 是的,斜杠被删除了,因为 IFS 设置为 \ ,这是 '\\' 转义的反斜杠。 OFS 仍然是默认设置,因此当写入 $0 字符串时,打印时将忽略所有 \ 字符。如果有一些你必须保留的代码对你不起作用。
    • +1 用于解决方案,但 ITYM FS 不是 IFS 在您的评论中。对于@user1007727 - 不要不断改变您的要求,只需告诉我们您真正需要做什么,以便我们一次性帮您解决。
    【解决方案3】:
    $ echo "10.46|5060|100002366551140|\WAPNER| john | M\ |100002366551750" | awk -F'|' '{print $1"|"$2"|"$3"|"$4$5$6"|"$7}' | sed s.\\\\..g
    10.46|5060|100002366551140|WAPNER john  M |100002366551750
    

    请注意,它仅在始终存在 3 个“|”的情况下才有效要删除的字符。

    更新:似乎我没有注意到标题 - 如果你想删除所有 '|'一对'\'之间的字符,jim mcnamara 的解决方案更好。

    【讨论】:

      【解决方案4】:

      试试这个

      sed -re 's/\\(\w+)(\|)( \w* )(\|)([ A-Za-z]+)\\/\1\3\5/g' temp.txt

      输出

      10.46|5060|100002366551140|WAPNER john M |100002366551750

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-16
        • 1970-01-01
        • 1970-01-01
        • 2012-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多