Bash Shell sed命令

Bash Shell sed命令,bash,shell,sed,tr,Bash,Shell,Sed,Tr,我有paths.txt,比如: pathO1/:pathD1/ pathO2/:pathD2/ ... pathON/:pathDN/ 如何在每个PathX/之后“sed”插入“*” 剧本是: while read line do cp $(echo $line | tr ':' ' ') done < "paths.txt" 读取行时 做 cp$(echo$行| tr':'') 完成

我有paths.txt,比如:

pathO1/:pathD1/
pathO2/:pathD2/
...
pathON/:pathDN/
如何在每个PathX/之后“sed”插入“*”

剧本是:

while read line
do
    cp $(echo $line | tr ':' ' ')   

done < "paths.txt"
读取行时
做
cp$(echo$行| tr':'')
完成<“path.txt”
替换为:

while read line
do
    cp $(echo $line | sed 's/:/* /1')   

done < "paths.txt"
读取行时
做
cp$(echo$行| sed's/:/*/1')
完成<“path.txt”
读取行时
做
path=`echo“$line”| sed's//://g'`
cmd=“cp$path”
echo$cmd
eval$cmd
完成<“/path.txt”

这似乎是一个与您之前提出的问题类似的问题:

在应用tr之前,只需使用删除额外“*”的技巧,如:

cp $(echo $line | sed 's/\*//1' | tr ':' '* ')
使用纯壳

while IFS=: read -r p1 p2
do
  cp $p1 "$p2"
done < file
而IFS=:read-rp1 p2
做
cp$p1“$p2”
完成<文件

快速且肮脏的awk一个无回路的衬里完成工作:

awk -F: '$1="cp "$1' paths.txt
这将输出:

cp /home/Documents/shellscripts/Origen/* /home/Documents/shellscripts/Destino/
cp /home/Documents/shellscripts/Origen2/* /home/Documents/shellscripts/Destino2/
...
如果要执行cmds,请执行以下操作:

awk -F: '$1="cp "$1' paths.txt|sh
我说它快而脏,因为:

  • 格式必须为
    path1:path2
  • 路径不能包含特殊字母(如空格)或

tr
中不能使用多个字符。为此,您需要
sed
或另一个。还有,你到底想做什么
cp$line$line带有*
?感谢fedorqui,我修复了将“tr”替换为“sed”的问题:cp$(echo$line | sed's/:/*/1)感谢您的回复。我试图从path1中删除“*”,以便获得:path1:path2而不获得path1/*:path2我仍然不太清楚您想要什么。您可以尝试将
-F:
更改为
-F'\*:'
并尝试一下。但我没有测试@user3228279I要从paths.txt中删除“*”(手动写入文本文件pathx/:pathDX/)并使用“sed”命令在每个原始路径的最后一个插入“*”。Thankscp$(echo$行| sed's/:/*/1')
awk -F: '$1="cp "$1' paths.txt|sh