即使在 bash 脚本中使用双引号,SED 扩展也不起作用
SED expansion not working even with double quotes in bash script
bash shell 脚本有点问题。
基本上,我将值插入到一个文件中,然后从中创建一个变量,并尝试通过 sed 在另一个文件中追加和扩展变量值。
即:
cat animal.txt
Dog: 5
Ferret: 1
Cat: 10
Hamster: 2
NUM=$(cat animal.txt)
然后我想将变量 'NUM' 中的值附加到另一个文件 temp.txt:
cat temp.txt
country: England city: Manchester
country: England city: Hull
country: England city: Liverpool
country: England city: London
尝试了所有这些变化,但 none 就足够了:
sed 's/$/'"${NUM}"'/' temp.txt
sed 's/$/"${NUM}"/' temp.txt
sed 's/$/'"${NUM}"'/' temp.txt
sed "s/$/"${NUM}"/" temp.txt
sed "s/$/${NUM}\/" temp.txt
这两个有点工作,但变量仍然没有展开:
sed 's/$/"${NUM}"/' temp.txt
sed 's/$/"${NUM}\"/' temp.txt
country: England city: Manchester "${NUM}"
country: England city: Hull "${NUM}"
country: England city: Liverpool "${NUM}"
country: England city: London "${NUM}"
即使我将整个表达式用双引号引起来:
sed "s/$/${NUM}/" temp.txt
sed "s/$/${NUM}\/" temp.txt
我得到:
sed: -e expression #1, char 27: unterminated `s' command
sed: -e expression #1, char 12: unterminated `s' command
期望输出:
country: England city: Manchester Dog: 5
country: England city: Hull Ferret: 1
country: England city: Liverpool Cat: 10
country: England city: London Hamster: 2
或
country: England city: Manchester Dog: 5
country: England city: Hull Ferret: 1
country: England city: Liverpool Cat: 10
country: England city: London Hamster: 2
我知道我应该避免使用单引号并使用双引号,但我错过了什么?
在这里使用 sed 是错误的工具吗?你认为 awk 会更好吗?
谢谢。
Is sed the wrong tool to work with here?
Yes probably.
无论如何,如果您的 animals.txt
文件足够小,您可以不用这个语句。
$ NUM="$(cat animal.txt)"; IFS=$'\n'; n=1; for num in $NUM; do i=0; while read -r line; do i=$((i + 1)); if [ $i -eq $n ]; then echo "$line" "$num"; n=$((n + 1)); break; fi; done < temp.txt; done
country: England city: Manchester Dog: 5
country: England city: Hull Ferret: 1
country: England city: Liverpool Cat: 10
country: England city: London Hamster: 2
但是对于大文件,awk 可能是更好的选择。
$ awk 'NR==FNR {num[FNR]=[=11=];next}{print [=11=] " " num[FNR]}' animal.txt temp.txt
country: England city: Manchester Dog: 5
country: England city: Hull Ferret: 1
country: England city: Liverpool Cat: 10
country: England city: London Hamster: 2
bash shell 脚本有点问题。 基本上,我将值插入到一个文件中,然后从中创建一个变量,并尝试通过 sed 在另一个文件中追加和扩展变量值。
即:
cat animal.txt
Dog: 5
Ferret: 1
Cat: 10
Hamster: 2
NUM=$(cat animal.txt)
然后我想将变量 'NUM' 中的值附加到另一个文件 temp.txt:
cat temp.txt
country: England city: Manchester
country: England city: Hull
country: England city: Liverpool
country: England city: London
尝试了所有这些变化,但 none 就足够了:
sed 's/$/'"${NUM}"'/' temp.txt
sed 's/$/"${NUM}"/' temp.txt
sed 's/$/'"${NUM}"'/' temp.txt
sed "s/$/"${NUM}"/" temp.txt
sed "s/$/${NUM}\/" temp.txt
这两个有点工作,但变量仍然没有展开:
sed 's/$/"${NUM}"/' temp.txt
sed 's/$/"${NUM}\"/' temp.txt
country: England city: Manchester "${NUM}"
country: England city: Hull "${NUM}"
country: England city: Liverpool "${NUM}"
country: England city: London "${NUM}"
即使我将整个表达式用双引号引起来:
sed "s/$/${NUM}/" temp.txt
sed "s/$/${NUM}\/" temp.txt
我得到:
sed: -e expression #1, char 27: unterminated `s' command
sed: -e expression #1, char 12: unterminated `s' command
期望输出:
country: England city: Manchester Dog: 5
country: England city: Hull Ferret: 1
country: England city: Liverpool Cat: 10
country: England city: London Hamster: 2
或
country: England city: Manchester Dog: 5
country: England city: Hull Ferret: 1
country: England city: Liverpool Cat: 10
country: England city: London Hamster: 2
我知道我应该避免使用单引号并使用双引号,但我错过了什么? 在这里使用 sed 是错误的工具吗?你认为 awk 会更好吗?
谢谢。
Is sed the wrong tool to work with here? Yes probably.
无论如何,如果您的 animals.txt
文件足够小,您可以不用这个语句。
$ NUM="$(cat animal.txt)"; IFS=$'\n'; n=1; for num in $NUM; do i=0; while read -r line; do i=$((i + 1)); if [ $i -eq $n ]; then echo "$line" "$num"; n=$((n + 1)); break; fi; done < temp.txt; done
country: England city: Manchester Dog: 5
country: England city: Hull Ferret: 1
country: England city: Liverpool Cat: 10
country: England city: London Hamster: 2
但是对于大文件,awk 可能是更好的选择。
$ awk 'NR==FNR {num[FNR]=[=11=];next}{print [=11=] " " num[FNR]}' animal.txt temp.txt
country: England city: Manchester Dog: 5
country: England city: Hull Ferret: 1
country: England city: Liverpool Cat: 10
country: England city: London Hamster: 2