我最近添加了一个question here关于如何使用sed和awk在文件中获取文本字符串并使用它来命名文件。现在我想弄清楚如何反过来 - 使用文件名,并将该文本插入到指定点的文件中。
使用相同的文字示例,假设此文件名为 test1.Rnw :
\begin{question}
A business incurs the following costs per unit: Labor \$125/unit; Materials \$45/unit and rent \$250,000/month. If the firm produces 1,000,000 units a month, the total variable costs equal
\begin{answerlist}
\item \$125Million
\item \$45Million
\item \$1Million
\item \$170Million
\end{answerlist}
\end{question}
\begin{solution}
\begin{answerlist}
\item F.
\item F.
\item F.
\item F.
\end{answerlist}
\end{solution}
\exname{target}
\extype{schoice}
\exsolution{0001}
\exshuffle{TRUE}
我现在想要取文件名test1.Rnw
并在该文件中的\ exname {target}处插入该文本,替换文本target
。我最好在这里插入test1
和不 .Rnw
扩展程序。
我希望我可以使用我的prior question(以及非常好的回复)来解决问题,但是我被卡住了。
=======
答案 0 :(得分:1)
鉴于target
中的\exname{target}
是您感兴趣的内容:
1)根据target
:
awk -F'[{}]' 'NR==FNR{if ($1=="\\exname") fname=$2; next} {print > fname}' file file
2)用当前文件名替换target
:
awk -F'[{}]' '$1=="\\exname"{ $0 = $1 "{" FILENAME "}" } 1' file
你不需要shell lop来操作多个文件,但在这种情况下它确实有一个简单,吸引人的一致语法:
for file in *; do
awk as above but replace `file` with `"$file"`
done
如果你想用awk命令的输出替换原始文件:
for file in *; do
awk -F'[{}]' 'NR==FNR{if ($1=="\\exname") fname=$2; next} {print > fname}' "$file" "$file" &&
rm -f "$file"
done
for file in *; do
awk -F'[{}]' '$1=="\\exname"{ $0 = $1 "{" FILENAME "}" } 1' "$file" > tmp &&
mv tmp "$file"
done
答案 1 :(得分:0)
您有不同的工作方式,我建议您使用sed
,因为您想要替换文件中的某些模式。
<强> INPUT:强>
$ cat test1.rnw
\begin{question}
A business incurs the following costs per unit: Labor \$125/unit; Materials \$45/unit and rent \$250,000/month. If the firm produces 1,000,000 units a month, the total variable costs equal
\begin{answerlist}
\item \$125Million
\item \$45Million
\item \$1Million
\item \$170Million
\end{answerlist}
\end{question}
\begin{solution}
\begin{answerlist}
\item F.
\item F.
\item F.
\item F.
\end{answerlist}
\end{solution}
\exname{target}
\extype{schoice}
\exsolution{0001}
\exshuffle{TRUE}
<强>命令:强>
FILENAME=`basename test1.rnw .rnw`; sed 's/^\\exname{target}/\\exname{'"$FILENAME"'}/' test1.rnw
<强>说明:强>
basename
命令与文件名和扩展名一起使用,将其从文件名中删除,结果存储在名为FILENAME
的变量中。find and replace
的{{1}}功能并替换sed
(以^\\exname{target}
开头的行\exname{target}
后跟\exname{
的内容变量并以FILENAME
<强>输出:强>
}
<强> TODO:强>
\begin{question}
A business incurs the following costs per unit: Labor \$125/unit; Materials \$45/unit and rent \$250,000/month. If the firm produces 1,000,000 units a month, the total variable costs equal
\begin{answerlist}
\item \$125Million
\item \$45Million
\item \$1Million
\item \$170Million
\end{answerlist}
\end{question}
\begin{solution}
\begin{answerlist}
\item F.
\item F.
\item F.
\item F.
\end{answerlist}
\end{solution}
\exname{test1}
\extype{schoice}
\exsolution{0001}
\exshuffle{TRUE}
或-i
进行更改(在此之前备份)<强> DOC:强>
https://www.gnu.org/software/sed/manual/sed.html
如果您是-i.bak
爱人,您还可以使用以下命令获得相同的结果:
awk
<强>说明:强>
awk '/^\\exname/{noext=FILENAME;sub(/\..*$/,"",noext);print "\\exname{"noext"}";next}1{print}' test1.rnw
将打印每一行1{print}
对于以/^\\exname/{noext=FILENAME;sub(/\..*$/,"",noext);print "\\exname{"noext"}";next}
开头的行,您访问了FILENAME并使用\exname
删除了该扩展程序,然后使用noext=FILENAME;sub(/\..*$/,"",noext)
打印该行并转到{{ 1}}行以避免双重打印。