查看: 553|回复: 8
打印 上一主题 下一主题

[求助] 请教如何在 Windows里cmd命令行将文件里的 ' 换成 ”

[复制链接]
  • TA的每日心情
    开心
    2019-8-21 08:44
  • 签到天数: 163 天

    [LV.7]常住居民III

    17

    主题

    393

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    14980
    跳转到指定楼层
    1
    发表于 2019-1-12 16:13:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 mikeee 于 2019-1-12 18:20 编辑

    其实很简单,假定 tmp.txt 里含 'a', 要在Windows的 cmd里换成 "a" 存到 tmp1.txt 里。
    我自己也算用命令行用得比较多的人。我的Win10里的 Gow、git、cygwin里含sed、awk、tr。 在 cmd 和 conemu 里试过
    • sed "s/'/\"/g" tmp.txt
      可以换,但无法存到另一个文件:sed "s/'/\"/g" tmp.txt > tmp1.txt 和 sed "s/'/\"/g" tmp.txt| tee tmp1.txt 都出错。由于命令里含 \" 导致的。
    • tr: 不行, cat tmp.txt|tr "'" "\"" 可以替换, cat tmp.txt|tr "'" "\"" > tmp1.txt 出错。
    • awk:不行,  awk "gsub(/'/, \"\\\"\");" tmp.txt 可以替换但不能用 > 或 tee 导向另一个文件。
    • 命令行python:不行, cat tmp.txt| python -c "import sys; import sys; print(sys.stdin.read().replace('\'', '\"'))" 可以替换,但没法用 > 导向。

    主要问题是这个 \": sed "s/'/x/g" tmp.txt > tmp1.txt、cat tmp.txt|tr "'" "x" > tmp1.txt、 awk "gsub(/'/, \"x\");" tmp.txt > tmp1.txt、cat tmp.txt| python -c "import sys; import sys; print(sys.stdin.read().replace('\'', 'x'))" > tmp1.txt 都没问题。

    不知道各路高人有什么高招没有,感谢。谷歌了一下,好像powershell 里可以,但我暂时不太想学powershell。

    sed 里的 -i 解决了问题,感谢 atauzki

    我自己折腾的python命令行,太繁琐,不过也记录一下:
    1. cat tmp.txt| python -c "import sys; import sys; str_=sys.stdin.read().replace('\'', '"'); f = open('tmp1.txt', 'wt', encoding='utf8'); f.write(str_)"
    复制代码

    本帖被以下淘专辑推荐:

  • TA的每日心情
    慵懒
    2021-9-28 14:33
  • 签到天数: 158 天

    [LV.7]常住居民III

    5

    主题

    907

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    17310

    QQ 章灌水大神章笑傲江湖章推广专家

    2
    发表于 2019-1-12 16:22:36 | 只看该作者
    先cp,然后用sed -i不行吗?

    点评

    评论右下角的“评分”不就可以送米么…  发表于 2019-1-12 18:07
    -i 好办法, 感谢!好像没办法送米……  发表于 2019-1-12 17:28

    评分

    1

    查看全部评分

  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

    250

    主题

    2966

    回帖

    53万

    积分

    状元

    吃水不忘挖井人

    Rank: 9Rank: 9Rank: 9

    积分
    531111

    灌水大神章笑傲江湖章推广专家QQ 章

    3
    发表于 2019-1-12 17:49:34 | 只看该作者
    试试
    1. sed -E "s/'/"/g" tmp.txt > tmp1.txt
    复制代码

    或者
    1. sed -r "s/'/"/g" tmp.txt > tmp1.txt
    复制代码


    或者如果用perl的话,试试:
    1. perl -pe"s/\'/"/g" tmp.txt > tmp1.txt
    复制代码

    评分

    1

    查看全部评分

  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

    250

    主题

    2966

    回帖

    53万

    积分

    状元

    吃水不忘挖井人

    Rank: 9Rank: 9Rank: 9

    积分
    531111

    灌水大神章笑傲江湖章推广专家QQ 章

    4
    发表于 2019-1-12 17:54:52 | 只看该作者
    atauzki 发表于 2019-1-12 16:22
    先cp,然后用sed -i不行吗?

    也可以不用手动cp,直接-ibak

    评分

    1

    查看全部评分

  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

    250

    主题

    2966

    回帖

    53万

    积分

    状元

    吃水不忘挖井人

    Rank: 9Rank: 9Rank: 9

    积分
    531111

    灌水大神章笑傲江湖章推广专家QQ 章

    5
    发表于 2019-1-12 18:26:44 | 只看该作者
    perl 那个重新导向无效?什么意思

    可以把 > tmp1.txt 删掉
    前面加上 -ibak 试试

    点评

    刚才查了一下,perl和sed在这方面是一样的  发表于 2019-1-12 18:52

    该用户从未签到

    0

    主题

    52

    回帖

    133

    积分

    禁止发言

    积分
    133
    6
    发表于 2020-2-3 15:05:15 | 只看该作者
    Thanks for your great work.