解析多行文件,并用Pipe替换每个第一次出现的文件

时间:2019-07-09 15:00:30

标签: unix

当前,我们收到一个文件,该文件更像是一个“名称/值”对。该对数据中的每个数据均由管道定界符分隔,而名称和值对则由空格分隔。我想用管道定界值内的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 |

1 个答案:

答案 0 :(得分:2)

sed脚本创建输出,如问题所示。

sed 's/\(|[^ ][^ ]*\) \([^|]\)/\1|\2/g' inputfile

从您的预期输出中,我假设如果在管道之后的第一个空格不能替换为|code_value ||Comments3 |中的管道,则应该用管道替换。

说明:

\(|[^ ][^ ]*\)-第一个捕获组,包含的字符不是空格,后跟0个或多个相同的字符
-后跟空格
\([^|]\)-第二捕获组包含的字符不是管道

\1|\2-替换为第1组,然后是管道和第2组

/g-替换所有出现的内容( g 小叶)

在空格之前和之后使用两个分组的模式,确保脚本不会替换后跟管道的空格。

编辑:根据您的sed,可以用[^ ]或其他变体替换第一组\(|[^ ][^ ]*\)中的双\(|[^ ]+*\)