你能帮我一个 sed 命令来搜索一行中的字符串"ABC = 0x000"并执行字符串中零的位置替换吗



我有一个字符串"ABC = 0x0000"在一行中,想要用x替换任意一个0。我想提取"ABC = 0x000"从包含此字符串的行并用x替换某些位置的零可以替换位置1和3或替换位置2和4等。我更喜欢就地执行这些操作(即使用-i选项,因为我不想创建文件)。

如有任何帮助,不胜感激。

我尝试使用命令sed -r 's/(ABC)/' file.csv。它给出了这个错误Sed: -e expression #1, char 12:未终止的' s' command

我首先想从这行提取ABC = 0x000,然后在字符串"0x000 "中执行位置替换。ABC = 0x0000也可以有更多的字符。

awdgb, ade nnm , ars, qwe: yur ABC = 0x0000 

则执行0的位置替换。

这可能适合您(GNU sed):

sed -E 's/(S+ = 0x)(S+)/1n2n/
h
s/[^n]*n//
s/n.*//
s/./a/1
s//a/3
s//b/2
s//b/4
H
g
s/n.*n(.*)n(.*)/21/' file

在要修改的字符串前后插入换行分隔符。

用分隔符复制该行。

删除行中分隔符前后的部分。

根据需要替换字符,使用从1开始的每个字符的索引。

将结果追加到原行。

将当前行替换为附加结果的原始行。

将原字符串替换为改进后的字符串。

你可以这样写:

sed -E 's/ABC = (0)x(0)(0)(0)(0)/ABC = 1x2345/g' myfile

在这里,字符串的每个零都捕获在单独的15组中,并且可以根据您的需要替换。

0xab00代替0x0000的例子为表达s/ABC = (0)x(0)(0)(0)(0)/ABC = 1xab45/g

我建议你在没有-i开关的情况下测试sed,达到所需的输出,一旦你对输出满意,只使用-i


尝试中的错误是由于缺少替换字符串引起的。s命令需要三个分隔符:s/pattern/replacement/flags.

最接近您尝试的有效命令是s/ABC //:它将用空字符串替换ABC的第一次出现。

使用任意awk:

$ awk -v poss='1 3' '
BEGIN { split(poss,ps) }
match($0,/ABC = [^ ]+/) {
s = RSTART + 6
for (i in ps) {
$0 = substr($0,1,s-2+ps[i]) "x" substr($0,s+ps[i])
}
}
{ print }
' file
awdgb, ade nnm , ars, qwe: yur ABC = xxx000

或者

$ awk -v poss='1 3' '
BEGIN { split(poss,ps) }
match($0,/ABC = [^ ]+/) {
$0 = substr($0,RSTART,RLENGTH)
for (i in ps) {
$0 = substr($0,1,6+ps[i]-1) "x" substr($0,6+ps[i]+1)
}
}
{ print }
' file
ABC = xxx000

最新更新