如何替换以*结尾的换行符(星号)

时间:2014-08-20 22:34:39

标签: bash awk sed

美好的一天,

我想知道如何用*进行替换。

输入:

"Table: 1.1.3 Nivel de Formacion: *
Seleccione el maximo nivel de formacion que usted ha alcanzado hasta el momento * Departamento - ."

我想要的输出:

"Table: 1.1.3 Nivel de Formacion: Seleccione el maximo nivel de formacion que usted ha alcanzado hasta el momento * Departamento - ."

替换:

sed 's/ \*\n/ /g'

awk '{ sub(/ \*\n/, ""); print }'

没有任何效果,为什么?

4 个答案:

答案 0 :(得分:2)

将GNU awk用于多字符RS:

$ awk -v RS=' \\*\n' -v ORS= '1' file
"Table: 1.1.3 Nivel de Formacion: Seleccione el maximo nivel de formacion que usted ha alcanzado hasta el momento Departamento - ."

你正在尝试的东西不起作用,因为sed总是一次读取1行而awk默认读取1行,所以在这两种情况下,每行末尾的终止\n是在您尝试将其替换为RE之前,该工具已经使用了该文件。

答案 1 :(得分:1)

您可以使用Perl:

perl -pe 's/\*\n//g'

答案 2 :(得分:1)

<强> SED

sed -r '{s/ \*$/ /; T; N; s/\n// }' file

<强> AWK

awk '
  / \*$/ { sub(/\*$/,""); printf("%s", $0); next }
  1
' file

答案 3 :(得分:1)

使用sed

sed '/\*$/{N;s/\*\n//;}' file

由于*是元字符,我们需要将其转义为允许sed了解它需要被视为文字字符。

我们为sed设置条件以查找以*结尾的行,如果我们找到这样的行,我们执行一个块状态,将下一行附加到模式空间,然后替换*\n什么都没有。