【问题标题】:Find`s placeholder {} sed from variable1 and put into variable2从 variable1 中查找占位符 {} sed 并放入 variable2
【发布时间】:2014-09-13 17:23:23
【问题描述】:

然后我使用这个脚本

for line in "`cat fromDirs.txt`"; 
do 
   find "$line" -type f \( -name '*good*' -o -exec grep -F "(NODES_'TASK')" {} \; \) -exec cp {} /tmp/ \;; 
done

我在文件夹/tmp 中只获得了复制它们的文件名,但我需要这个文件名包含它们所在位置的完整路径,我厌倦了尝试与 sed 打架,请帮助

所以我只需要获取每个 {} 值并将斜杠 (/) 替换为减号 (-)

我尝试了很多变种,但都不好,这段代码也不起作用

for line in "`cat fromDirs.txt`"; 
do 
   find "$line" -type f \( -name '*good*' -o -exec grep -F "(NODES_'TASK')" {} \; \) -exec cp {} /tmp/$(sed "s/\//-/g" <<< {}) \;;
done

文件 fromDirs.txt 包含

/home/orders/
/etc/bin/school/

没有输出,只是没有任何东西,也许是因为我使用 sh?我在系统上根本没有 bash

我认为问题出在 sed 中,因为它将占位符 {} 读取为文件而不是字符串,因此如果 {} = /home/orders/good.php 然后 sed 打开此文件并将所有斜杠更改为减号,但我只需要在文件名中更改斜杠所以 /home/orders/good.php -&gt; -home-orders-good.php 然后 cp 到 /tmp/-home-orders-good.php

【问题讨论】:

  • 你能提供一个示例输入文件和预期结果

标签: linux bash unix sed


【解决方案1】:

我猜你有问题,因为你双引号文件的输出。
尝试更改:

for line in "`cat fromDirs.txt`";

到:

for line in `cat fromDirs.txt`; 

或更好(去除旧的和过时的背部抽动):

for line in $(cat fromDirs.txt); 

最佳(使用 while 读取文件):

#!/bin/bash
while read line
do
   find "$line" -type f \( -name '*good*' -o -exec grep -F "(NODES_'TASK')" {} \; \) -exec cp {} /tmp/$(sed "s/\//-/g" <<< {}) \;;
done < fromDirs.txt

【讨论】:

  • cat fromDirs.txt 中的行;对于 $(cat fromDirs.txt) 中的行;也不起作用(只是没什么),第三个变种根本不适合我stackoverflow.com/questions/25821119/…
  • @DmitrijHolkin 你从echo $(cat fromDirs.txt)得到什么
  • fromDirs.txt /home/orders/ /etc/bin/school/的内容
猜你喜欢
  • 2014-10-19
  • 1970-01-01
  • 1970-01-01
  • 2019-03-05
  • 2014-05-30
  • 2019-06-21
  • 2017-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多