Sed 当使用n个实例时
我试图替换文件中第n个出现的子字符串。我试着用它来实现这一点,但所有的尝试都没有给我想要的输出。其中一些尝试是:Sed 当使用n个实例时,sed,shell,awk,perl,Sed,Shell,Awk,Perl,我试图替换文件中第n个出现的子字符串。我试着用它来实现这一点,但所有的尝试都没有给我想要的输出。其中一些尝试是: sed 's/old/new/g' sed 's/old/new/3' sed 's/old/new/3g' 最常见的用法是执行替换,例如 sed 's/foo/bar/' file 这将用字符串bar替换第一次出现的字符串foo,并对文件中的每一行执行此操作 如果只想替换字符串foo的第三个匹配项,但要对每一行执行此操作,则可以编写: sed 's/foo/bar/3' fil
sed 's/old/new/g'
sed 's/old/new/3'
sed 's/old/new/3g'
最常见的用法是执行替换,例如
sed 's/foo/bar/' file
这将用字符串bar
替换第一次出现的字符串foo
,并对文件中的每一行执行此操作
如果只想替换字符串foo
的第三个匹配项,但要对每一行执行此操作,则可以编写:
sed 's/foo/bar/3' file.
最后,如果要替换所有引用,请使用:
sed 's/foo/bar/g' file.
任何组合,例如
sed 's/foo/bar/3g' file
导致未指定行为
如果要替换文件中的第n个匹配项,则不是正确的工具,但或可能更好
- 如果您知道每行最多出现一次“foo”,您可以这样做
awk '/foo/{c++}(c==n){sub("foo","bar")}1' file
- 如果每行出现一个以上的引用,则会变得有点棘手,可以采用多种解决方案:
awk 'BEGIN{FS="foo";OFS="bar";n=5}
(c<n) && (c+NF-1>=n) {
for(i=1;i<NF;++i) printf $i ((++c==n) ? OFS : FS); print $NF; next
}
{c+=NF-1; print}' file
awk'BEGIN{FS=“foo”OFS=“bar”;n=5}
(c=n){
对于(i=1;我将讨论堆栈溢出问题!请澄清您当前遇到的具体问题,因为很难准确说出您的问题。请回答您的问题,并包括其他信息,例如您用来引出您所做声明的命令。这将帮助其他人查看问题,以便他们能够帮助您。若要编辑,请单击您的post的链接在问题的下方和左侧找到一行,然后粘贴到所需的材料中。另外,请看一看。我是否正确地理解了您想用新的子字符串替换第n次出现的子字符串。或者您想替换前n次出现的子字符串?根据您的编辑,我理解您尝试了sed's/old/new/g'
andsed's/old/new/3g'
。还有,你为什么说sed“s/old/new/1”
不执行任何替换?我已经更新了你的问题。你能检查一下这是否反映了你想要的吗?所以我有三行。在所有这些行中,我有“test”一词但是我只想在第二行和第三行中替换它。因此我使用了命令“s/old/new/2”和“s/old/new/3”。但是内容没有被替换。这是正确的方法还是我有不同的方法来处理这个问题?是的,更新的问题是正确的。我将给出我需要解决的示例。我有以下几行-第1行-“测试”第2行-“测试”如果我使用上面的命令,它不起作用,而它与/g一起起作用。我在shell脚本中使用它。我应该做些什么不同的事情吗?所以基本上/3搜索一行中的第三个出现,而我希望它像一行中的第三个出现一样file@Ragavendarbalaji我已经更新了答案,以满足您的要求。您能告诉我是什么吗at是此命令中的错误:awk-v n=2'/\'text\'=>.*/^C{if(++count==n)sub(/\'text\'=>./,“\'text\'=>\'my-text\',”);}1'文件名。php@Ragavendarbalaji我不知道这个命令应该做什么,但是^C
看起来有点不可靠