在文件中的字符串后插入换行符



我有一个独特的(对我来说)情况: 我有一个文件-file.txt包含以下数据:

"Line1", "Line2", "Line3", "Line4"

我想在每次找到模式",时插入换行符。file.txt的输出应如下所示:

"Line1", 
"Line2", 
"Line3", 
"Line4"

我很难逃脱",. 我尝试了sed -i -e "s/",/n/g" file.txt,但我没有得到预期的结果。

我正在寻找使用perlsed的单衬。

您可以使用此gnu sed

sed -E 's/(",)[[:blank:]]*/1n/g' file.txt
"Line1",
"Line2",
"Line3",
"Line4"

请注意如何在sed命令中使用单引号以避免不必要的转义。

如果您没有gnu sed那么这里有一个符合 POSIXsed解决方案:

sed -E 's/(",)[[:blank:]]*/1
/g' file.txt

要以内联方式保存更改,请使用:

sed -i.bak -E 's/(",)[[:blank:]]*/1
/g' file.txt

你能不能试试下面。 在这里使用awk的替换机制,以防你对awk没问题。

awk -v s1=""" -v s2="," '{gsub(/",[[:blank:]]+"/,s1 s2 ORS s1)} 1' Input_file

这是一个Perl解决方案:

perl -pe 's/",K/n/g' file.txt

替换模式与",匹配,但K说忽略左边的任何替换(所以,",)不会被替换。然后,替换将有效地插入换行符。

我使用单引号作为参数-e,但这不适用于您必须使用"的 Windows。您可以用另一种方式指定它,而不是转义"。这是代码编号 0x22,所以你可以写:

perl -pe "s/x22,K/n/g" file.txt

或八进制:

perl -pe "s/42,K/n/g" file.txt

使用这个 Perl 单行:

perl -F'/"K,s*/' -lane 'print join ",n", @F;' in_file > out_file

或者这个用于在线更换:

perl -i.bak -F'/"K,s*/' -lane 'print join ",n", @F;' in_file
Perl 单行代码使用这些命令行标志:
-e:告诉 Perl 在内联中查找代码,而不是在文件中查找代码.
-n

:一次循环一行输入,默认情况下将其分配给$_.
-l:在内联执行代码之前去除输入行分隔符(默认情况下在 *NIX 上"n"), 并在打印时附加它.
-a:将$_拆分为数组@F空格或-F选项中指定的正则表达式.
-F'/"K,s*/':在双引号上拆分为@F,后跟逗号,后跟 0 个或多个空格字符,而不是空格。K:使正则表达式引擎"保留"它在K之前匹配的所有内容,而不是将其包含在匹配中。这会导致在@F元素中保留双引号,而在拆分过程中删除逗号和空格.
-i.bak:就地编辑输入文件(覆盖输入文件)。在覆盖之前,通过将扩展名.bak附加到原始文件的名称来保存原始文件的备份副本。

另请参阅:
perldoc perlrun: 如何执行 Perl 解释器: 命令行开关
perldoc perlrequick: Perl 正则表达式快速入门

最新更新