代码之家  ›  专栏  ›  技术社区  ›  bucabay

xargs echo'echo sed's/pattern/replace/''不起作用,但每个循环都起作用。

  •  -2
  • bucabay  · 技术社区  · 6 年前

    我想做的相当于:

    for i in `ls -1`; do echo $i | mv $i `sed 's/profile/account/'`; done
    

    具有 xargs

    ls -1 | xargs -I{} mv {} `echo {} | sed 's/profile/account/'`
    

    但是 sed 忽略背景中的管道之后。 有人知道为什么会这样吗?

    编辑:更多信息

    根本的问题就是在直接给定的模式替换(这里是replace)中重命名文件 profile 具有 account 但是,这是用 for in 循环文件。

    我提出的问题是,为什么下面的内容不起作用。

    LS-1 xargs-i mv ` echo sed's/profile/account/'。`
    

    为什么

    `echo {} | sed 's/profile/account/'`
    

    部分不返回替换的文件名,而是返回原始文件名。就好像 | 在背景中不起作用。

    要以不同的方式编写问题:

    如果我有一个列表,就像在一个名为 list.txt

    profile1.txt
    profile2.txt 
    

    并希望生成

    account1.txt
    account2.txt 
    

    同时在每一行上单独操作,这样我就可以对它运行一个命令。

    cat list.txt | xargs -I{} echo `echo {} | sed 's/profile/account/'`
    

    为什么命令返回:

    简介1.TXT
    Pr2.2.TXT
    

    而不是将配置文件更改为帐户?

    3 回复  |  直到 6 年前
        1
  •  0
  •   potong    6 年前

    这可能适用于您(GNU并行):

    parallel 'old={}; new=${old/profile/account}; echo mv $old $new' ::: *
    

    去除 echo 一旦检查。

        2
  •  0
  •   jjo    6 年前

    同意上述关于使用壳牌全球业务拓展的意见,而不是 ls -1 或者直接使用 prename 不过,如果您想输入管道其他输出(例如 find 或类似的)。

    下面是通过调用一个迷你脚本来实现的,其中每个脚本的参数都是 xargs 使用var替换bash isms的fed line(注意 ls ... 要能够无错误地重新运行这些文件,请执行以下操作:

    ls -1 *profile* | xargs -l1 bash -xc 'echo mv "$1" "${1/profile/account}"' --
    

    以上注释为 干运行 删除 echo 真正做到这一点。

        3
  •  0
  •   bucabay    6 年前

    在例子中:

    cat list.txt | xargs -I{} echo `echo {} | sed 's/profile/account/'`
    

    xargs不插入 {} 在背景中。

    所以:

    `echo {} | sed 's/profile/account/'`
    

    回响字面意思 {} . 随后 sed 不会改变 {} .

    ` echo sed's/profile/account/'。`
    

    将返回: {}

    它给出:

    cat list.txt | xargs -I{} echo {}