Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sed 当使用n个实例时_Sed_Shell_Awk_Perl - Fatal编程技术网

Sed 当使用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

我试图替换文件中第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' 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'
    and
    sed'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
    看起来有点不可靠