2015-09-24 45 views
-1

我需要将给定输入格式化为显示的输出。我该怎么做?使用shell脚本将文件输入格式化为所需输出

输入:

\n \abc\:\abc_2\,\n \rick\:\rick_1\,\n \harry\:\harry_1\,\n \Christine\:\Christine_2\,\n 

enter image description here

+0

是输入格式一行满载着反斜杠等特殊字符?如果不是,它看起来像什么?你想用哪些工具('sed','awk','perl','python',别的东西)?你有什么尝试?什么给了你一个问题? –

+0

我正在考虑使用awk ..实际上sed在我的shell脚本中不工作,当我试图删除\ n或\ – Arpan

+0

,否则: - abc:abc_2,rick:rick_1,harry:harry_1,Christine:Christine_2 ,我可以使用awk'BEGIN {RS =“,”;} {print $ 1}“..这对我很有用 这个输入将会在一个文本文件中,我在我的shell脚本中使用..然后我必须将其格式化为提及的输出 – Arpan

回答

1

随着GNU AWK多焦RS:

$ awk -v RS=',?\\\\n[[:space:]]+' 'gsub(/\\/,"")' file 
abc:abc_2 
rick:rick_1 
harry:harry_1 
Christine:Christine_2 
1

如果数据在一行满载着反斜杠到达,那么我认为你可以sed工作,小心一点。

  • 您需要用换行符替换每个\,序列。
  • 您需要替换每个\n后跟零个或多个空格。
  • 您需要将其余的反斜杠全部替换为空。
  • 你需要删除最后的换行符(所以你没有两个)。

这相当于:

echo '\n \abc\:\abc_2\,\n \rick\:\rick_1\,\n \harry\:\harry_1\,\n \Christine\:\Christine_2\,\n' | 
sed -e 's/\\,/\n/g' \ 
    -e 's/\\n *//g' \ 
    -e 's/\\//g' \ 
    -e 's/\n$//' 

这正常工作对我来说,当我使用GNU sed。它不会用BSD(Mac OS X)sed产生'正确的'输出;我没有在输出中插入换行符。这是因为BSD sed附着在POSIX sed规范,它说:

转义序列“\n”应匹配嵌入模式空间<newline>。文字<newline>不得用于上下文地址的BRE或替代函数中。

而对于sed在Mac OS X的手册页说大同小异:

\n匹配嵌入模式空间换行符的转义序列。但是,您不能在地址或替代命令中使用文字换行符。

你如何解决这个问题?痛苦地,可能是答案。可以使用的y命令,因为POSIX说:

[2addr] y/string1/string2/
字符串2替换字符的所有出现在字符串1与相应的字符。如果在string1string2中出现<backslash>后跟'n' [原文],则这两个字符应作为单个<newline>处理。如果字符数string1string2不相等,或者string1中的任何字符出现不止一次,则结果未定义。可以使用除<backslash><newline>以外的任何字符来代替<slash>来分隔字符串。如果分隔符不是'n',则在string1string2之内,如果分隔符前面有<backslash>,则该分隔符本身可以用作文字字符。如果<backslash>字符紧跟一个<backslash>字在字符串1字符串2,两个<backslash>字符应当计数为单一字面<backslash>字符。 <backslash>后跟任何不是'n'的字符,<backslash>或分隔符字符的含义都是未定义的。

Mac OS X的手册页不那么冗长,也没有那么潇洒的准确,但说得很一样。所以,我想诀窍是将\,映射到字符,如Control-A,然后使用y/^A/\n/Control-A映射到换行符。

即:

echo '\n \abc\:\abc_2\,\n \rick\:\rick_1\,\n \harry\:\harry_1\,\n \Christine\:\Christine_2\,\n' | 
sed -e 's/\\,/^A/g' \ 
    -e 'y/^A/\n/' \ 
    -e 's/\\n *//g' \ 
    -e 's/\\//g' \ 
    -e 's/\n$//' 

(其中显示什么为^A实际上是一个控制-A;我需要使用控制-V控制-Avim获得字符输入到)无论如何,这适用于Mac OS X或BSD sed

相关问题