Bash替换' \ n \ n}'文件中的字符串

时间:2015-04-28 13:31:34

标签: regex bash perl awk sed

我已经重复包含字符串\n\n}的文件,我需要用\n}替换这样的字符串(删除两个换行符中的一个)。
由于这些文件是通过bash脚本动态生成的,我需要在脚本中嵌入替换代码。

我尝试使用以下命令,但它不起作用:

cat file.tex | sed -e 's/\n\n}/\n}/g' # it doesn't work!
cat file.tex | perl -p00e 's/\n\n}/\n}/g' # it doesn't work!
cat file.tex | awk -v RS="" '{gsub (/\n\n}/, "\nb")}1' # it does work, but not for large files

6 个答案:

答案 0 :(得分:3)

你没有提供任何样本输入和预期输出所以这是一个猜测,但也许这就是你要找的东西:

$ cat file
a
b

c

}
d

$ awk '/^$/{f=1;next} f{if(!/^}/)print "";f=0} 1' file
a
b

c
}
d

答案 1 :(得分:1)

sed的一种方式:

sed -i -n ':a;N;$!ba;s/\n\n}/\n}/g;p' file.tex

细节:

:a             # defines the label "a"
N              # append the next line to the pattern space
$!ba           # if it is not the last line, go to label a
s/\n\n}/\n}/g  # replace all \n\n} with \n}
p              # print

i参数将更改文件。 n参数可防止自动打印行。

答案 2 :(得分:1)

Nix样式的行过滤器逐行处理文件 。因此,您必须做一些额外的事情来处理跨越行的表达式。

正如其他人所提到的,'\n\n'只是一个空行并匹配正则表达式/^$/。也许最有效的方法是保存每个空行,直到你知道下一行是否在行的开头包含一个紧括号。

cat file.tex | perl -ne 'if ( $b ) { print $b unless m/^\}/; undef $b; } if ( m/^$/ ) { $b=$_; } else { print; } END { print $b if $b; }'

为了清理它们,我们添加了一个END块,以处理文件中最后一行是空白的情况(我们想保留它)。

答案 3 :(得分:1)

这应该有效:

cat file.tex | sed -e 's/\\n\\n}/\\n}/g'

如果\n\n}被写为原始字符串。

或者如果是新行:

cat file.tex | sed -e ':a;N;$!ba;s/\n\n}/\n}/g'
  

另一种方法:

如果第一个\n任何新行:

text=$(< file.tex)
text=${text//$'\n\n}'/$'\n}'}
printf "%s\n" "$text" #> file

如果第一个\n是空行:

text=$(< file.tex)
text=${text//$'\n\n\n}'/$'\n\n}'}
printf "%s\n" "$text" #> file

答案 4 :(得分:1)

此Perl命令将按您的要求执行

chmod a-x

答案 5 :(得分:0)

如果您有权访问节点,则可以使用rexreplace

rexreplace '\n\n\}' '\n\}' myfile.txt

然后运行

data

如果您在目录rexreplace '\n\n\}' '\n\}' data/*.txt 中有更多文件,则可以执行

w+