我所拥有的是一个文件(让我们称之为' xfile'),包含诸如
之类的行file1 <- this line goes to file1
file2 <- this goes to file2
我想要做的是运行一个脚本来完成实际的线路并将它们写入文件。
我手动完成的方式可能如下(第一行)
(echo "this line goes to file1"; echo) >> file1
所以,要实现自动化,这就是我尝试做的事情
IFS=$'\n'
for l in $(grep '[a-z]* <- .*' xfile); do
$(echo $l | sed -e 's/\([a-z]*\) <- \(.*\)/(echo "\2"; echo)\>\>\1/g')
done
unset IFS
但我得到的是
-bash: file1(echo "this content goes to file1"; echo)>>: command not found
-bash: file2(echo "this goes to file2"; echo)>>: command not found
(在OS X上)
出了什么问题?
答案 0 :(得分:2)
这解决了您在Linux上的问题
awk -F ' <- ' '{print $2 >> $1}' xfile
注意选择字段分隔符,使新文件没有前导或尾随空格。
尝试OSX
答案 1 :(得分:1)
您可以直接使用bash的正则表达式功能。当您使用=~
运算符将变量与正则表达式进行比较时,bash会使用正则表达式中的组匹配来填充BASH_REMATCH
数组。
re='(.*) <- (.*)'
while read -r; do
if [[ $REPLY =~ $re ]]; then
file=${BASH_REMATCH[1]}
line=${BASH_REMATCH[2]}
printf '%s\n' "$line" >> "$file"
fi
done < xfile