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

Insert linebreak in a file after a string

我有一个独特的(对我来说)情况: 我有一个文件 - 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:]]*/\n/g' file.txt

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

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

如果您没有 gnu sed 那么这里有一个 POSIX 兼容的 sed 解决方案:

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

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

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

能否请您尝试以下。在此处使用 awk 的替换机制,以防您对 awk.

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

使用这个 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: how to execute the Perl interpreter: command line switches
perldoc perlrequick: Perl regular expressions quick start

这是一个 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/2,\K/\n/g" file.txt