【问题标题】:xargs echo `echo {} | sed 's/pattern/replace/'` doesn't work but for each loop worksxargs echo `echo {} | sed 's/pattern/replace/'` 不起作用,但对于每个循环都有效
【发布时间】:2019-03-25 12:24:08
【问题描述】:

我想做相当于:

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 被忽略了。 有谁知道为什么会这样?

编辑:更多信息

根本问题只是在直接给定的模式替换中重命名文件(这里将 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/'`

为什么命令返回:

profile1.txt
profile2.txt 

而不是将个人资料更改为帐户?

【问题讨论】:

  • echo {} ... 周围引用错误?
  • 首先,请don't parse ls.. 使用for i in *.. 其次,put variables inside double quotes 除非你有其他原因......最后,你能解释一下你正在尝试的问题是什么解决?理想情况下,给我们一两个文件名,以及您对这些文件的预期输出是什么
  • 你可以直接在shell变量上使用parameter expansion而不是调用sed(除非你需要正则表达式功能)

标签: linux shell sed command xargs


【解决方案1】:

这可能对你有用(GNU 并行):

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

检查后删除echo

【讨论】:

    【解决方案2】:

    同意上面关于使用 shell glob 扩展而不是 ls -1 或使用 prename 的直接解决方案的 cmets,但是如果您想为管道提供其他输出(例如 find 或一样)。

    下面是通过调用一个迷你 scriptlet 来实现的,其中它的参数是每个 xargs 馈线,使用 var 替换 bash-isms(注意缩小的 ls ... 能够重新运行而不会出现错误):

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

    注意上面是 dry-run,删除 echo 以实际执行。

    【讨论】:

      【解决方案3】:

      在示例中:

      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 {}
      

      【讨论】:

        猜你喜欢
        • 2013-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多