sed 'h # save the current line in the hold space
s/[^:]*:// # delete everything up to the marker
s/foo/FOO/g # YOUR COMPLICATED COMMAND GOES HERE
x # swap pattern and hold space
s/:.*/:/ # delete from the first : to the end in the original line
G # append hold space (: with whatever follows it)
s/\n//' yourfile # remove the newline that comes with G
sed 'h # save the current line in the hold space
s/:/\x0:/ # mark the first : by prepending a null character
s/.*\x0// # delete everything up to the marker
x # swap pattern and hold space
s/:.*// # delete from the first : to the end in the original line
s/foo/FOO/g # YOUR COMPLICATED COMMAND GOES HERE
G # append hold space (: with whatever follows it)
s/\n//' yourfile # remove the newline that comes with G
5条答案
按热度按时间t3irkdon1#
为了 简单 起见 , 我 假设 您 要 用
FOO
替换 第 一 个:
* * 之后 * * 出现 的 每个foo
。中 的 每 一 个
上述 代码 已 根据 在 评论 中 收到 的 建议 进行 了 更新 。
最初 的 答案 如下 所 示 , 虽然 在 本 例 中 有点 矫枉过正 , 但 它 表明 可以 在
sed
、\x0
作为 一 个 " 标记 " , 通常 可以 假定 它 不在 文本 文件 中( 与 使用_xxx_
形成 对比 ,_xxx_
可能 已经 存在 于 文件 中 ) 。 * *( 第 二 个 版本 替换 了foo
* 在 *:
之前 的 出现 , 与 我 误读 问题 时 一致 。 * * )格式
vfh0ocws2#
awk
在这里可以用作更好的替代:这里我们使用
:
拆分输入,并将:
之前的第一个字段保存在变量s
中。然后我们运行几个gsub
函数来完成所有替换,最后我们将保存的变量与行的其余部分一起打印。p8h8hvxi3#
这 可能 对 你 有用 ( GNU sed ) :
中 的 每 一 个
在 第 一 个
:
之前 引入 一 个 换行符 。将 结果 复制 到 保留 空间 ( HS ) 。
全局 替换/转换 一 次 或 多次 。
将 模式 空间 ( PS ) 附加 到 HS 。
将 PS 更换 为 HS 。
删除 换行符 和 换行符 之间 的 所有 内容 。
a5g8bdjr4#
首先将
grep
输出的每一行拆分为2行,然后在偶数行上执行sed
命令。看起来就像
对于
0~2
,您将告诉sed
仅在偶数行上操作。示例:
输出:
c9qzyr3d5#
您可以尝试Perl替代方法。下面是一个使用正lookbehind的解决方案