在字符串后的文件中插入换行符
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
,但没有得到想要的结果。
我正在寻找使用 perl
或 sed
的单衬垫。
你可以使用这个 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
我有一个独特的(对我来说)情况:
我有一个文件 - file.txt
包含以下数据:
"Line1", "Line2", "Line3", "Line4"
我想在每次找到模式 ",
时插入一个换行符。
file.txt
的输出应如下所示:
"Line1",
"Line2",
"Line3",
"Line4"
我很难逃脱",
。
我尝试了 sed -i -e "s/\",/\n/g" file.txt
,但没有得到想要的结果。
我正在寻找使用 perl
或 sed
的单衬垫。
你可以使用这个 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