使用“grep -n”和echo ::解释双反斜杠

时间:2016-01-26 05:56:33

标签: regex linux bash

我想将带有“\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跳过此双反斜杠(带有附加标记或更明确模式)?

由于

2 个答案:

答案 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#pf1http://mywiki.wooledge.org/DontReadLinesWithFor