我有一个独特的(对我来说)情况: 我有一个文件-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:]]*/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 正则表达式快速入门