将shell脚本应用于文件中的字符串并替换引号内的字符串

时间:2015-07-14 14:51:34

标签: linux bash shell

假设我有一个文件greeting.txt(双引号在文件中,只有一行):

"Hello world!"

文件names.txt(没有双引号,多行,这里以2显示):

Tom
Mary

然后我想创建一个创建文件greeting_to_Tom.txt

的bash脚本
"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错误地替换。任何人都可以帮我完成这项任务吗?

3 个答案:

答案 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