我已经重复包含字符串\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
答案 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+