我想将带有“\label
”的模式“grep -n
”的行号放入文件中。
文件内容为:
\begin{equation}
(\beq{f'_{i}})_{3}-(\beq{e_{i}})_{3}=\text{d}\delta\,\beq{e_{i}}-\delta\,\text{d}\beq{e_{i}}
\label{r58}
\end{equation}
...
\begin{align}
&\beq{mm'_{3}}-\beq{mm_{3}}=\text{d}\delta\,\beq{m}-\delta\,\text{d}\beq{m}
\label{r59} \\
&(\beq{e'_{i}})_{3}-(\beq{e_{i}})_{3}=\text{d}\delta\,\beq{e_{i}}-\delta\,\text{d}\beq{e_{i}}
\label{r60}
\end{align}
...
\begin{equation}
(\beq{g'_{i}})_{3}-(\beq{e_{i}})_{3}=\text{d}\delta\,\beq{e_{i}}-\delta\,\text{d}\beq{e_{i}}
\label{r61}
\end{equation}
...
我使用的命令:
for k in $(grep -n '\\label' test.tex); do echo $k; done
我得到了:
...
1366:\label{r58}
1376:\label{r59}
\\
1378:\label{r60}
1388:\label{r61}
...
我希望:
...
1366:\label{r58}
1376:\label{r59}
1378:\label{r60}
1388:\label{r61}
...
鉴于我处理k variable
的值之后,我想跳过具有双反斜杠的行,似乎“grep -n
”解释了双反斜杠。
我知道我可以在k
上执行管道命令,例如“grep -v '\\\\
”,但是我可以直接使用grep -n
跳过此双反斜杠(带有附加标记或更明确模式)?
由于
答案 0 :(得分:1)
您可以使用
修复换行问题$ for k in "$(grep -n '\\label' text.tex)"; do echo "$k"; done
3:\label{r58}
10:\label{r59} \\
12:\label{r60}
19:\label{r61}
即,引用命令替换。这是一种非常复杂(并且不推荐)的方式,只需使用
grep -n '\\label' test.tex
看起来很像。
如果你没有引用命令替换,它的结果会进行分词,而\\
被视为一个单独的元素循环,这就是为什么它有自己的行。
要获得所需的部件,可以使用
$ grep -on '\\label{[^}]*}' test.tex
3:\label{r58}
10:\label{r59}
12:\label{r60}
19:\label{r61}
-o
只保留匹配,正则表达式也匹配\label
之后的大括号。
答案 1 :(得分:0)
由于这个问题用Bash标记,我假设您正在使用Bash shell。
以下代码将input_file.txt
作为输入文件,并创建包含与您的模式匹配的行号列表的output_file.txt
。
while read -r line;do printf '%s\n' "${line%%:*}";done < <(grep -n --fixed-strings '\label' input_file.txt) > output_file.txt
<强> P.S。强>
关于您在问题中发布的代码:
切勿这样做:for x in $(command)
或command
或$ var。 for-in用于迭代参数,而不是(输出)字符串。相反,使用glob(例如。* .txt),数组(例如。"${names[@]}"
)或while-read
循环(例如while read -r line
)。请参阅http://mywiki.wooledge.org/BashPitfalls#pf1和http://mywiki.wooledge.org/DontReadLinesWithFor