我需要将给定输入格式化为显示的输出。我该怎么做?使用shell脚本将文件输入格式化为所需输出
输入:
\n \abc\:\abc_2\,\n \rick\:\rick_1\,\n \harry\:\harry_1\,\n \Christine\:\Christine_2\,\n
我需要将给定输入格式化为显示的输出。我该怎么做?使用shell脚本将文件输入格式化为所需输出
输入:
\n \abc\:\abc_2\,\n \rick\:\rick_1\,\n \harry\:\harry_1\,\n \Christine\:\Christine_2\,\n
随着GNU AWK多焦RS:
$ awk -v RS=',?\\\\n[[:space:]]+' 'gsub(/\\/,"")' file
abc:abc_2
rick:rick_1
harry:harry_1
Christine:Christine_2
如果数据在一行满载着反斜杠到达,那么我认为你可以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与相应的字符。如果在string1或string2中出现<backslash>
后跟'n'
[原文],则这两个字符应作为单个<newline>
处理。如果字符数string1和string2不相等,或者string1中的任何字符出现不止一次,则结果未定义。可以使用除<backslash>
或<newline>
以外的任何字符来代替<slash>
来分隔字符串。如果分隔符不是'n',则在string1和string2之内,如果分隔符前面有<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控制-A在vim
获得字符输入到)无论如何,这适用于Mac OS X或BSD sed
。
是输入格式一行满载着反斜杠等特殊字符?如果不是,它看起来像什么?你想用哪些工具('sed','awk','perl','python',别的东西)?你有什么尝试?什么给了你一个问题? –
我正在考虑使用awk ..实际上sed在我的shell脚本中不工作,当我试图删除\ n或\ – Arpan
,否则: - abc:abc_2,rick:rick_1,harry:harry_1,Christine:Christine_2 ,我可以使用awk'BEGIN {RS =“,”;} {print $ 1}“..这对我很有用 这个输入将会在一个文本文件中,我在我的shell脚本中使用..然后我必须将其格式化为提及的输出 – Arpan