当前,我们收到一个文件,该文件更像是一个“名称/值”对。该对数据中的每个数据均由管道定界符分隔,而名称和值对则由空格分隔。我想用管道定界值内的Pipe替换空间。
我将管道替换为双重代码,并尝试使用下面的Perl命令行添加,然后用Pipe值替换空格。但这是将Pipe添加到该空间的每个实例中。
perl -pe' s{("[^"]+")}{($x=$1)=~tr/ /|/;$x}ge'
样本数据:
|id 12345|code_value TTYE|Code_text Sample Data|Comments3 |
|id 23456|code_value2 UHYZ|Code_text3 Second Line Text|Comments M D Test|
|id 45677|code_value4 TEST DAT|Code_text Third line|Comments2 A D T Come|
|id 78904|code_value |Code_text2 Done WIth Sample data|Comments |
预期结果:
|id|12345|code_value|TTYE|Code_text|Sample Data|Comments3 |
|id|23456|code_value2|UHYZ|Code_text3|Second Line Text|Comments|M D Test|
|id|45677|code_value4|TEST DAT|Code_text|Third line|Comments2|A D T Come|
|id|78904|code_value |Code_text2|Done WIth Sample data|Comments |
答案 0 :(得分:2)
此sed
脚本创建输出,如问题所示。
sed 's/\(|[^ ][^ ]*\) \([^|]\)/\1|\2/g' inputfile
从您的预期输出中,我假设如果在管道之后的第一个空格不能替换为|code_value |
或|Comments3 |
中的管道,则应该用管道替换。
说明:
\(|[^ ][^ ]*\)
-第一个捕获组,包含的字符不是空格,后跟0个或多个相同的字符
-后跟空格
\([^|]\)
-第二捕获组包含的字符不是管道
\1|\2
-替换为第1组,然后是管道和第2组
/g
-替换所有出现的内容( g 小叶)
在空格之前和之后使用两个分组的模式,确保脚本不会替换后跟管道的空格。
编辑:根据您的sed
,可以用[^ ]
或其他变体替换第一组\(|[^ ][^ ]*\)
中的双\(|[^ ]+*\)
。