Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 将shell脚本应用于文件中的字符串并替换引号中的字符串_Linux_Bash_Shell - Fatal编程技术网

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

Linux 将shell脚本应用于文件中的字符串并替换引号中的字符串,linux,bash,shell,Linux,Bash,Shell,假设我有一个文件greeting.txt(文件中有双引号,只有一行): 和一个文件names.txt(没有双引号,多行,这里以2为例): 然后,我想创建一个bash脚本,用于创建文件greeting\u to_Tom.txt: "Hello Tom!" "Hello Mary!" 和问候玛丽.txt: "Hello Tom!" "Hello Mary!" 我对shell脚本非常熟悉,所以在我拼凑了我搜索的内容后,我尝试: 问候all.sh: #!/bin/bash filename="g

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

和一个文件
names.txt
(没有双引号,多行,这里以2为例):

然后,我想创建一个bash脚本,用于创建文件
greeting\u to_Tom.txt

"Hello Tom!"
"Hello Mary!"
问候玛丽.txt

"Hello Tom!"
"Hello Mary!"
我对shell脚本非常熟悉,所以在我拼凑了我搜索的内容后,我尝试:

问候all.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
。有人能帮我完成这项任务吗?

问题出在
xargs
命令中。它接受
names.txt
的内容,并将其作为
/greetingToAll.sh
命令的参数。因此,产生的调用是

./greetingToAll.sh Tom Mary
在这次通话中,1美元是Tom,这是正确的替换。你可能想这样做

cat names.txt | while read name; do ./greetingToAll.sh "$name"; done

这将调用
/greetingToAll.sh
两次,一次作为
/greetingToAll.sh“Tom”
,一次作为
/greetingToAll.sh“Mary”
创建
greetingToAll
,如下所示:

greeting=$(cat greeting.txt)
while read -r name; do 
  echo "$greeting" | sed "s/world/$name/" > "greeting_to_$name.txt"
done < "$1"
根据您正在执行的操作,最好将脚本参数化,以便从您选择的任何文件中获取问候语:

greeting=$(cat "$1")
while read -r name; do 
  echo "$greeting" | sed "s/world/$name/" > "greeting_to_$name.txt"
done < "$2"

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
./greetingToAll greeting.txt names.txt
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!"