【问题标题】:sed command is not working properlysed 命令无法正常工作
【发布时间】:2015-01-07 01:41:15
【问题描述】:

我正在尝试用 sed -e command 替换 shell 脚本中的单词,但它没有替换,请帮忙,我已经尝试了以下

我们在/data/docs/config.log 中有一个单独的文件,在那个文件中有一个单词 ?account 例如,

用户名 acc,密码 acc,?account.name

需要使用 sed -e 命令将这个 ?account 单词替换为单词 'GLOBAL',

reacc = GLOBAL

sed -e "s/?account/$reacc/g" /data/docs/config.log > /data/docs/newconfig.log 

但是这里的文件 newconfig.log 已经创建了 0 大小,没有写入文件的输出,它没有替换它的空文件,

输出应该是username acc, passsword acc, GLOBAL.name in newconfig.log

【问题讨论】:

  • reacc = GLOBAL 不是有效的 shell 变量赋值,您需要删除空格。 ? 是一个正则表达式特殊字符,可能需要转义(但在模式开始时可能不需要)。你确定config.log 有内容吗?您是否不小心运行了sed -e .... /data/docs/config.log > /data/docs/config.log 并将config.log 文件归零?
  • 无法在 Bash 上重现。你用的是什么外壳?
  • 脚本是 , #! /bin/sh
  • 感谢 Etan,我删除了空间,但只生成了空文件,是的 config.log 有以下内容用户名 acc,密码 acc,?account.name,如果我用 echo $reacc 检查它的给正确的输出为 GLOBALS ,我也尝试使用静态输出,如 sed -e "s/?account/$reacc/g" /data/docs/config.log >$1 但没有结果

标签: sed


【解决方案1】:

作为唯一可以重现问题的人,您几乎只能靠自己。不过,您可以做很多事情来分析问题。

  • 仔细检查外壳。不要盲目相信#!/bin/sh。例如,在 cygwin 中,/bin/sh 是 bash 的别名。验证:echo $SHELL
  • 检查权限和文件系统。您是否有权写入输出文件?磁盘是否已满? cat /data/docs/config.log > /data/docs/newconfig.log 有效吗?在不同的文件夹中再次测试。
  • 仔细检查输出文件。它真的是空的,还是文件系统更新文件大小很慢? sed真的完了吗?没有输出重定向的测试;查看输出是否转储到标准输出。
  • 用小文件测试;一两行就够了。
  • 如果这样也不起作用,请测试sed 本身。谁知道呢,也许你有一个奇怪的别名,隐藏了真正的sed。最简单的过滤器是sed -e '',它应该简单地回显您键入的每一行(就像cat 不带参数一样)。那样有用吗?然后尝试一些简单的模式。

系统地在成功的测试用例和失败的测试用例之间进行迭代,直到找到断点。这样做,您应该能够找到原因。抱歉,我现在只能为你做这些了。

【讨论】:

    【解决方案2】:

    删除= 周围的空格。制作后再试

    reacc=GLOBAL
    

    【讨论】:

    • 感谢删除空间并尝试使用 reacc=GLOBAL 但仍然没有运气 o 大小文件
    猜你喜欢
    • 1970-01-01
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多