使用sed和awk将文件名复制到文件中

时间:2018-05-10 00:56:07

标签: macos awk sed

我最近添加了一个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(以及非常好的回复)来解决问题,但是我被卡住了。

=======

2 个答案:

答案 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}}行以避免双重打印。