我将许多表输入到一个 tex 文件中,并想将每个表中的“括号中的标准错误”替换为“我想要的任何东西”。
例子
\documentclass[12pt,a4paper]{article}
\usepackage[UTF8]{ctex}
\begin{document}
\input{table.tex}
\input{table.tex}
\end{document}
表格.tex
\begin{table}[htbp]\centering
\def\sym#1{\ifmmode^{#1}\else\(^{#1}\)\fi}
\caption{table \label{tab3}}
\begin{tabular}{l*{3}{c}}
\hline\hline
&\multicolumn{1}{c}{(1)E}&\multicolumn{1}{c}{(2)W}&\multicolumn{1}{c}{(3)M}\\
\hline
ln$\chi$ & 3.163\sym{***}& 4.133\sym{***}& 2.017\sym{***}\\
& (0.696) & (0.451) & (0.442) \\
\hline
FE & Y & Y & Y \\
N & 1005 & 980 & 825 \\
R2 & 0.660 & 0.583 & 0.624 \\
\hline\hline
\multicolumn{4}{l}{\footnotesize Standard errors in parentheses}\\
\multicolumn{4}{l}{\footnotesize \sym{*} \(p<0.05\), \sym{**} \(p<0.01\), \sym{***} \(p<0.001\)}\\
\end{tabular}
\end{table}
IDE:Texpad 1.731
引擎:Xelatex、BibTex
答案1
如果您可以选择使用 LuaLaTeX,那么以下示例中显示的方法可能适合您。dosub
设置了一个名为 的 Lua 函数来执行字符串替换操作,并提供了 LaTeX 代码来将此函数的操作限制在table
环境中。因此,除了环境内部之外可能出现的字符串“括号中的标准错误”实例table
将保持不变。
% !TeX program = lualatex
\RequirePackage{filecontents}
%% create the files 'table1.tex' and 'table2.tex'
\begin{filecontents}{table1.tex}
\begin{table}[htbp]
\centering
\def\sym#1{\ifmmode^{#1}\else\(^{#1}\)\fi}
\caption{A first table \label{tab1}}
\begin{tabular}{l*{3}{c}}
\hline\hline
&\multicolumn{1}{c}{(1)E}&\multicolumn{1}{c}{(2)W}&\multicolumn{1}{c}{(3)M}\\
\hline
$\ln\chi$ & 3.163\sym{***}& 4.133\sym{***}& 2.017\sym{***}\\
& (0.696) & (0.451) & (0.442) \\
\hline
FE & Y & Y & Y \\
N & 1005 & 980 & 825 \\
R\sym{2} & 0.660 & 0.583 & 0.624 \\
\hline\hline
\multicolumn{4}{l}{\footnotesize Standard errors in parentheses}\\
\multicolumn{4}{l}{\footnotesize \sym{*} \(p<0.05\), \sym{**} \(p<0.01\), \sym{***} \(p<0.001\)}\\
\end{tabular}
\end{table}
\end{filecontents}
\begin{filecontents}{table2.tex}
\begin{table}[htbp]
\centering
\def\sym#1{\ifmmode^{#1}\else\(^{#1}\)\fi}
\caption{A second table \label{tab2}}
\begin{tabular}{l*{3}{c}}
\hline\hline
&\multicolumn{1}{c}{(1)A}&\multicolumn{1}{c}{(2)B}&\multicolumn{1}{c}{(3)C}\\
\hline
$\ln\chi$ & 3.163\sym{***}& 4.133\sym{***}& 2.017\sym{***}\\
& (0.696) & (0.451) & (0.442) \\
\hline
FE & Y & Y & Y \\
N & 1005 & 980 & 825 \\
R\sym{2} & 0.660 & 0.583 & 0.624 \\
\hline\hline
\multicolumn{4}{l}{\footnotesize Standard errors in parentheses}\\
\multicolumn{4}{l}{\footnotesize \sym{*} \(p<0.05\), \sym{**} \(p<0.01\), \sym{***} \(p<0.001\)}\\
\end{tabular}
\end{table}
\end{filecontents}
\documentclass[12pt,a4paper]{article}
%%\usepackage[UTF8]{ctex}
%>>>> --- new code starts here ---
\usepackage{luacode,etoolbox}
\begin{luacode}
function dosub ( s )
return ( string.gsub ( s , "Standard errors in parentheses",
"Anything I want" ) )
end
\end{luacode}
\AtBeginEnvironment{table}{\directlua{
luatexbase.add_to_callback("process_input_buffer", dosub, "dosub" ) }}
\AtEndEnvironment{table}{\directlua{
luatexbase.remove_from_callback("process_input_buffer", "dosub" ) }}
%<<<< --- new code ends here ---
\begin{document}
\input table1
This instance of ``Standard errors in parentheses'' is not modified.
\input table2
\end{document}
答案2
如果您使用基于 Unix 的系统,我会使用 GNUgrep
和 GNU来实现这一点。perl
如果您计划替换任意数量的文件中的任意文本,则需要了解如何使用命令行终端。
如果使用基于 DOS 的,您只需安装类似 Babun 的东西即可快速获得最小的 Linux 虚拟机和终端仿真器。
在空文件夹中设置模拟
1. 创建 10 个包含所需字符串的表
for i in $(echo table{01..10}.tex); do touch $i && echo "Standard errors in parentheses & col2 & col3 \\\\" > $i;done
2. 使用正则表达式(Perl 方言)递归列出匹配项(用于检查)
grep -Prn 'Standard errors in parentheses'
3.使用 Perl 和 Grep 的输出递归替换文本
perl -i -pe 's/Standard errors in parentheses/whatever/g' $(grep -Prl 'Standard errors in parentheses')
笔记
如果您想在写入文件之前确保替换正常工作,您可以写入终端。
perl -pe 's/Standard errors in parentheses/whatever/g' $(grep -Prl 'Standard errors in parentheses')
或者使用扩展名 .bak 保存备份
perl -i.bak -pe 's/Standard errors in parentheses/whatever/g' $(grep -Prl 'Standard errors in parentheses')
我已经专业地处理大型文本好几年了,并且尝试过不同的正则表达式语言方言。根据我的经验,Perl 是最有用和最受接受的方言。
- 前瞻和回顾非常有用
- 非贪婪运算符(驯服占位符,例如
*
您?)
想要查找所有 s 的内容\paragraph{...}
,但其他一些\macro{}
可能在同一行。只需键入grep -Prn '\\paragraph\{.*?\}'
即可在第一个 处停止}
。