gpt4 book ai didi

linux - 如何使用 sed 或其他命令将每行的现有字符串替换为不同的字符串

转载 作者:太空宇宙 更新时间:2023-11-04 04:50:03 25 4
gpt4 key购买 nike

for i in 1 2 3 4 5 6 7; do
sed "s/\number\b/& =$i/" print.txt
done

print.txt 包含:

number elephant
number giraffe
number dogs
number cats
number mouse
number pigs
number snake

如何在 for 循环中替换文本文件的一行中的单词/字符串而不更改每一行?每当我运行我的脚本时,它都会将所有“数字”变成一个特定数字,并且到最后一次迭代运行时,所有“数字”都会被 7 替换。我明白为什么它会这样做,只是不知道如何修复它。

在这个简单的例子中,我希望它像这样输出:

1 elephant
2 giraffe
3 dogs
4 cats
5 mouse
6 pigs
7 snake

但是假设,在我的 for 循环中,它定义了一个变量为山羊,第二次迭代为鸡,我希望将 pig 更改为山羊,将蛇更改为鸡,我如何在 for 循环中执行此操作?

最佳答案

如果我知道您想将每行中的 "number" 替换为递增的值 1-7,那么您根本不需要(或不需要)循环。只需将 sed 从每行开头删除 "number" 字符串的结果通过管道传输到 nl -w1 -s' ' 即可对行进行编号。示例:

$ sed 's/^number\s*//' print.txt | nl -w1 -s' '
1 elephant
2 giraffe
3 dogs
4 cats
5 mouse
6 pigs
7 snake

(注意:您也可以使用 grep -o '\w*$' print.txt | nl -w1 -s' ')

您可以使用选项调整数字格式和分隔符。请参阅man 1 nl

你为什么不想要一个循环?您调用 sed 并在循环中生成额外的子 shell 次数有多少次? (每次迭代一次)。这是极其低效的。任何时候在 shell 中循环时,您都希望最大程度地减少循环中生成的子 shell 的数量。

你能像你尝试的那样用循环来做吗?当然可以,但这是您能想到的效率最低的解决方案之一。为了使其在循环中工作,您必须将每次迭代的操作限制在文件中所需的行。您可以通过抑制正常输出并仅输出您更改的行来做到这一点,例如

for i in 1 2 3 4 5 6 7; do
sed -n "${i}s/number/$i/p" print.txt
done

(但不要这样做......)

如果您想要一个更有效的解决方案来消除管道和额外的子shell,只需使用awk和一个计数器(下面的n),例如

$ awk -v n=1 '{print n++ " " $2}' print.txt
1 elephant
2 giraffe
3 dogs
4 cats
5 mouse
6 pigs
7 snake

您同样可以使用 printf 而不是上面的 print 来进一步控制数字和分隔符格式。

如果您有疑问或想要不同的东西,请告诉我。

<小时/>

回答评论问题

如果您有 3 行具有相同的字段,您想要将其更改为其他内容,那么您首先必须知道要将相同的字段更改为什么。这意味着您必须在某处有一个替换表查找表替换内容。

假设您的文本文件实际上是:

$ cat print2.txt
number elephant
number giraffe
number dogs
number cats
number pigs
number pigs
number pigs

并且您想按顺序将第 5、6、7 行从 "pigs" 更改为 "goat", "cow", "chicken",然后使用 awk 将替换值读取到数组中,并使用计数器进行替换以确定要使用哪个替换。 (下面我们只是用三个替换填充一个数组)

您可以执行类似于以下操作:

awk 'BEGIN {n=1; rep[1]="goat"; rep[2]="cow"; rep[3]="chicken"}
$2=="pigs"{$2=rep[n++]}
{print}
' print2.txt

在命令行复制/粘贴将产生:

$ awk 'BEGIN {n=1; rep[1]="goat"; rep[2]="cow"; rep[3]="chicken"}
> $2=="pigs"{$2=rep[n++]}
> {print}
> ' print2.txt
number elephant
number giraffe
number dogs
number cats
number goat
number cow
number chicken

因此,您可以按照评论中的要求进行操作 - 您只需要提前知道将用什么替换重复项即可。

关于linux - 如何使用 sed 或其他命令将每行的现有字符串替换为不同的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59923204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com