【问题标题】:Sed on AIX does not recognize -i flagAIX 上的 Sed 无法识别 -i 标志
【发布时间】:2011-11-06 03:54:33
【问题描述】:

sed -i 在 AIX 上工作吗?

如果没有,我如何在 AIX 上“就地”编辑文件?

【问题讨论】:

    标签: sed aix


    【解决方案1】:

    -i 选项是sed 命令的 GNU(非标准)扩展。它不是sed 的经典界面的一部分。

    您不能直接在 AIX 上进行原位编辑。您必须执行以下操作:

    sed 's/this/that/' infile > tmp.$$
    mv tmp.$$ infile
    

    您一次只能处理一个文件,而-i 选项允许您为其参数列表中的许多文件中的每一个获得结果。 -i 选项只是打包了这一系列事件。这无疑是有用的,但它不是标准的。

    如果你编写这个脚本,你需要考虑如果命令被中断会发生什么;特别是,您不想留下临时文件。这导致类似:

    tmp=tmp.$$      # Or an alternative mechanism for generating a temporary file name
    for file in "$@"
    do
        trap "rm -f $tmp; exit 1" 0 1 2 3 13 15
        sed 's/this/that/' $file > $tmp
        trap "" 0 1 2 3 13 15
        mv $tmp $file
    done
    

    如果在sed 运行时出现信号(HUP、INT、QUIT、PIPE 或 TERM),则会删除临时文件。一旦sed 完成,它会在mv 发生时忽略信号。

    您仍然可以通过在与源文件相同的目录中创建临时文件等操作来增强此功能,而不是在完全不同的文件系统中创建文件。

    另一个增强功能是允许在命令行上指定命令(示例中为sed 's/this/that')。这变得更棘手了!

    您可以查看 Kernighan 和 Pike 在其经典著作 'The UNIX Programming Environment' 中描述的 overwrite (shell) 命令。

    【讨论】:

    • 视情况而定,您可能更喜欢:cp $file $file.bak.$$; sed 's/my/script/' $file.bak.$$ > $file 这将在执行 sed 之前为您提供备份,这可能有它的优势。
    【解决方案2】:

    您可以在 AIX 上简单地安装 GNU 版本的 Unix 命令:

    http://www-03.ibm.com/systems/power/software/aix/linux/toolbox/alpha.html

    【讨论】:

      【解决方案3】:

      你可以在 vi 中使用 here 结构:

      vi file >/dev/null 2>&1 <<@
      :1,$ s/old/new/g
      :wq
      @
      

      当您想在 vi 编辑模式下进行操作时,您需要一个 ESC。
      对于 ESC,请按 CTRL-V ESC
      当您在非交互模式下使用它时,vi 可能会抱怨未设置 TERM。解决方法是在调用vi之前添加export TERM=vt100

      【讨论】:

        【解决方案4】:

        另一种选择是使用好的旧版,像这样:

        ed fileToModify <<EOF
        ,s/^ff/gg/
        w
        q
        EOF
        

        【讨论】:

          【解决方案5】:

          你可以使用 perl 来做到这一点:

          perl -p -i.bak -e 's/old/new/g' test.txt
          

          将创建一个 .bak 文件。

          【讨论】:

            【解决方案6】:
            #!/bin/ksh
            host_name=$1
            perl -pi -e "s/#workerid#/$host_name/g" test.conf 
            

            上面将在 test.conf 中将 #workerid# 替换为 $host_name

            【讨论】:

              猜你喜欢
              • 2014-07-11
              • 2013-06-09
              • 2014-09-19
              • 2018-10-21
              • 1970-01-01
              • 2021-03-21
              • 2016-01-19
              • 1970-01-01
              • 2015-06-20
              相关资源
              最近更新 更多