艾克斯 | sed -i 选项不适用于特定的行号

Posted

技术标签:

【中文标题】艾克斯 | sed -i 选项不适用于特定的行号【英文标题】:AIX | sed -i option not working for the specific line number 【发布时间】:2019-11-07 20:27:27 【问题描述】:

我想使用脚本在 aix os 中的特定行号上插入/删除一行。

我正在尝试下面的代码

no2=103
dis=<disabled></disabled>
sed "$no2 a $dis" $node > vi.xml

到目前为止,我已经尝试过 awk,可执行 vi 命令。还没有任何效果

错误输出如下:

server:/u/vwadhwa/MIMOnOffHold $ ./script.sh INTACTIX_TO_NDW_ITX007 stop
Performing stop action on dirmon-INTACTIX_TO_NDW_ITX007 which is present in node-IKBNODE01.xml
sed: Not a recognized flag: i
Usage:  sed [-n] [-u] Script [File ...]
        sed [-n] [-u] [-e Script] ... [-f Script_file] ... [File ...]

【问题讨论】:

-i 不是 posix 选项,显然不是由 aix 的 sed 实现的。 【参考方案1】:

这种通过在特定行插入文本来就地编辑文件是ed 的一个很好的用例(我假设 AIX 有)。

$no2 行之前插入一个新行(使其成为新行$no2;使用a 在该行之后插入):

ed -s "$node" <<EOF
$no2 i
$dis
.
w
q
EOF

并删除行$no2

ed -s "$node" <<EOF
$no2 d
w
q
EOF

虽然看起来您正在使用 XML,但这意味着理解 XML 的工具将是更好的选择 - 如果您的文件发生更改,导致在第 103 行盲目添加标签导致其无效怎么办?

【讨论】:

这里的“$node”是什么? @VinitaWadhwani $node 是什么?大概是一个文件名;至少,您在问题中就是这样使用它的。 看看我尝试了什么,如果我做错了,请告诉我。 laq9esbpt225:/u/qmima20/MIMOnOffHold $ node=vini.txt laq9esbpt225:/u/qmima20/MIMOnOffHold $ ed -s "$node" &lt;&lt;EOF &gt; 2 i &gt; VINITAAAAA &gt; w &gt; q &gt; EOF laq9esbpt225:/u/qmima20/MIMOnOffHold $ cat vini.txt vini vinita vinitaaa vani @VinitaWadhwani 这是一个难以理解的混乱。评论不是看起来像是多行复制和粘贴的地方。【参考方案2】:

不完全确定你在问什么,但如果你只是想插入一个新行,你可以使用这样的东西,$dis 是你要插入的行:

perl -pe "s/^/$dis\n/ if \$. == $line_number" input_file > output_file

您还可以使用-i 标志来编辑文件:

perl -i -pe "s/^/$dis\n/ if \$. == $line_number" input_file

【讨论】:

根本不起作用``` laq9esbpt225:/u/qmima20/MIMOnOffHold $ dis=cini laq9esbpt225:/u/qmima20/MIMOnOffHold $ line_number=5 laq9esbpt225:/u/qmima20/MIMOnOffHold $ perl -i -pe "s/^/$dis\n/ if \$. == $line_number" vini.txt laq9esbpt225:/u/qmima20/MIMOnOffHold $ cat vini.txt vini vinita vinitaaa vani ``` 您的文件中只有 4 行,但您指定了第 5 行? 以什么方式?您可以像添加任何其他命令一样将其添加到 shell 脚本中

以上是关于艾克斯 | sed -i 选项不适用于特定的行号的主要内容,如果未能解决你的问题,请参考以下文章

Linux三剑客(sed)-编辑匹配到的文本

使用 sed 或 awk 在特定行号处插入一行

使用 sed 或 awk 在特定行号处插入一行

换行换行符不适用于 UILabel 仅适用于特定文本字符串

linux之sed命令详解

sed 使用行号与关键字匹配限定行范围