假设我有一个文件greeting.txt
(双引号在文件中,只有一行):
"Hello world!"
文件names.txt
(没有双引号,多行,这里以2显示):
Tom
Mary
然后我想创建一个创建文件greeting_to_Tom.txt
:
"Hello Tom!"
和greeting_to_Mary.txt
:
"Hello Mary!"
我是shell脚本的新手,所以在我拼凑了搜索后,我尝试了:
greetingToAll.sh
:
#!/bin/bash
filename="greeting_to_"$1".txt"
cp greeting.txt $filename
sed -i 's/world/$1/' $filename
并在命令行中键入:
cat names.txt | xargs ./greetingToAll.sh
但只有Tom
被识别,并被$1
错误地替换。任何人都可以帮我完成这项任务吗?
答案 0 :(得分:1)
问题出在xargs
命令中。它采用names.txt
的内容并将其作为./greetingToAll.sh
命令的参数。结果调用是
./greetingToAll.sh Tom Mary
在这次通话中,1美元是汤姆,并且正确地被替换。你可能想做
cat names.txt | while read name; do ./greetingToAll.sh "$name"; done
这会两次调用./greetingToAll.sh
,一次调用./greetingToAll.sh "Tom"
,一次调用./greetingToAll.sh "Mary"
。
答案 1 :(得分:1)
这个awk
单行也可以完成这项任务:
awk 'FNR==NR{a[++n]=$1; next} $2=="world!\"" {
for (i=1; i<=n; i++){s=$0; sub(/world/, a[i], s);
print s > "greeting_to_" a[i] ".txt"}}' names.txt greetings.txt
验证强>
grep -H Hello greeting_to_*
greeting_to_Mary.txt:"Hello Mary!"
greeting_to_Tom.txt:"Hello Tom!"
答案 2 :(得分:0)
如果您创建greetingToAll
如下所示:
greeting=$(cat greeting.txt)
while read -r name; do
echo "$greeting" | sed "s/world/$name/" > "greeting_to_$name.txt"
done < "$1"
你可以打电话给:
./greetingToAll names.txt
根据您正在做的事情,可能更好的做法是参数化脚本以从您选择的任何文件中获取问候语:
greeting=$(cat "$1")
while read -r name; do
echo "$greeting" | sed "s/world/$name/" > "greeting_to_$name.txt"
done < "$2"
然后可以打电话给:
./greetingToAll greeting.txt names.txt