【发布时间】:2021-12-28 18:09:34
【问题描述】:
您好,我希望执行以下操作:
file= sample.out
将10-15 位置的任何文本替换为"77777",但仅限于以ABC 开头的行
目前为止:
cat sample.out | sed -r 's/^ABC(.{9})/\177777/'
但行首的ABC 被删除,77777 被插入到文本位置,而不是替换该位置的现有字符。
【问题讨论】:
您好,我希望执行以下操作:
file= sample.out
将10-15 位置的任何文本替换为"77777",但仅限于以ABC 开头的行
目前为止:
cat sample.out | sed -r 's/^ABC(.{9})/\177777/'
但行首的ABC 被删除,77777 被插入到文本位置,而不是替换该位置的现有字符。
【问题讨论】:
没有例子我用这个。
文件:repl.txt
0000000001111111111222222222233333333333
1234567890123456789012345678901234567890
ABCDEFGH<12345>IJKLMNOPQRSTUVWXYZ======:
使用这个命令:
$ sed -e 's/^\(ABC.\{6\}\).\{5\}\(.*\)$/\177777\2/' repl.txt
0000000001111111111222222222233333333333
1234567890123456789012345678901234567890
ABCDEFGH<77777>IJKLMNOPQRSTUVWXYZ======:
【讨论】:
请使用@Arnaud 帖子中的示例尝试关注awk 程序。
awk -v newVal="77777" '/^ABC/{print substr($0,1,9) newVal substr($0,16);next} 1' Input_file
解释: 简单的解释是,在这里使用awk 程序。首先创建一个名为newVal 的awk 变量,其中包含77777 值。在主程序中检查行是否从 ABC 开始,然后打印子字符串(打印当前行中第 10 到 15 位以外的所有内容,在其位置打印新值)。如果不满足条件(即:行不是从 ABC 开始),则简单地打印该行。
【讨论】:
这可能对你有用(GNU sed):
sed '/^ABC/{s/./&\n/14;T;s//\n&/10;s/\n.*\n/77777/}' file
ABC 在行首的模式匹配,用换行符分隔字符 10-14(5 个字符)并将它们替换为替换字符串。
注意使用的分隔符必须是唯一的(换行符不能是任何模式空间的一部分,因为 sed 使用换行符来定义模式空间)。此外,分隔符必须从最大到最小插入,因为换行符会打乱从行首开始的计数。
要从特定位置覆盖,请使用:
sed -E '/^ABC/{s/./\n&/10;T;s/$/\n77777/;:a;s/\n.(.*\n)(.)/\2\n\1/;ta;s/\n//g}' file
另一种选择:
sed -E 's/^(ABC.{6}).{5}/\177777/' file
【讨论】: