Regex 使用sed、awk等分隔中间点字符后的字符
我需要你的帮助;我保证我真的很努力地寻找答案,但没有运气 我想在每个“·”(中间点)字符之间分隔文本 (基本上按音节) 上述代码输出: 骗局· 这是我想要的第一部分,但最终我希望输出: con·Regex 使用sed、awk等分隔中间点字符后的字符,regex,bash,awk,sed,Regex,Bash,Awk,Sed,我需要你的帮助;我保证我真的很努力地寻找答案,但没有运气 我想在每个“·”(中间点)字符之间分隔文本 (基本上按音节) 上述代码输出: 骗局· 这是我想要的第一部分,但最终我希望输出: con· 格拉特· u· 迟 这将涉及获取介于第1-2次和第2-3次出现的“·”之间的字符 如果有人能给我指引正确的方向,我会非常感激,我会自己解决剩下的问题 编辑 很抱歉,我没有正确显示所需的输出。不过,你的解决方案效果很好 由于将所有内容保持为一行对我来说很重要,我将如何输出第一个点和第二个点之间的文本,以输
格拉特·
u·
迟 这将涉及获取介于第1-2次和第2-3次出现的“·”之间的字符 如果有人能给我指引正确的方向,我会非常感激,我会自己解决剩下的问题 编辑 很抱歉,我没有正确显示所需的输出。不过,你的解决方案效果很好 由于将所有内容保持为一行对我来说很重要,我将如何输出第一个点和第二个点之间的文本,以输出:
grat·
我是用UTF-8做的,乔纳森
再一次,很抱歉问错了问题。简单地说
echo con·grat·u·late | sed -e 's/·/·\n/g'
将每个
·
替换为·
,后跟换行符。在GNU sed中,您可以执行以下操作:
echo con·grat·u·late | sed -e 's/·/&\n/g'
&
代表匹配的模式,在本例中为·
。
不幸的是,这在BSD sed中不起作用
对于更便携的解决方案,我建议使用此AWK,
应在GNU和BSD系统中工作:
echo con·grat·u·late | awk '{ gsub("·", "&\n") } 1'
因为您希望在点之间运行字符,所以可以像这样尝试sed
echo 'con.grat.u.late'|sed 's/\.*\./&\n/g'|sed -n 2p|tr -d '.'
打印第1点和第2点之间的字符组
echo 'con.grat.u.late'|sed 's/\.*\./&\n/g'|sed -n 2p|tr -d '.'
结果
grat
u
con
grat
u
注意:我使用2p
打印第一点和第二点之间的字符
打印第二点和第三点之间的字符组
echo 'con.grat.u.late'|sed 's/\.*\./&\n/g'|sed -n 3p|tr -d '.'
结果
grat
u
con
grat
u
注意:我使用3p
打印第二点和第三点之间的字符
您也可以使用sed完成整个操作,但我使用tr
命令,因此您可以很容易地进行操作。tr
命令在打印前删除点。如果要删除点,请从命令行中排除|tr-d'.
您还可以打印字符组的范围
echo 'con.grat.u.late'|sed 's/\.*\./&\n/g'|sed -n 1,3p|tr -d '.'
结果
grat
u
con
grat
u
您可以使用simple将这些单词分开:
$ echo 'con.grat.u.late' | awk -F. '{print $1}'
con
$ echo 'con.grat.u.late' | awk -F. '{print $2}'
grat
$ echo 'con.grat.u.late' | awk -F. '{print $3}'
u
$ echo 'con.grat.u.late' | awk -F. '{print $4}'
late
$ echo 'con.grat.u.late' | awk -F. '{for(i=1;i<=NF;i++){print $i}}'
con
grat
u
late
$echo'con.grat.u.late'| awk-F.{print$1}'
骗局
$echo'con.grat.u.late'| awk-F.{print$2}'
格拉特
$echo'con.grat.u.late'| awk-F.{print$3}'
U
$echo'con.grat.u.late'| awk-F.{print$4}'
晚的
$echo'con.grat.u.late'| awk-F.{for(i=1;iIs您在ISO 8859-1中的数据,因此中间点(·
)是一个单字节\xB7
,或者是UTF-8,因此u+00B7或两个字节\xC2\xB7
)都可以处理;这种差异可能对模式匹配至关重要(尽管如此,由于它是一种直接替换,即使是不知道Unicode的程序也可以正确处理UTF-8).所以你不希望单词的一部分出现在新行上?你更喜欢只打印第一个点和第二个点之间的字符?是的,Xorg,我想打印第一个点和第二个点之间的字符,然后是第二个点和第三个点,然后是第三个点和第四个点,等等。echo'con·grat·u·late'
|awk-F.{print$1}等等。。。(1美元、2美元等将分别包含con、grat、u、late.)在我们几个人已经回答了您最初的问题之后,最好再问另一个问题。您的更改使我们的回答无效,以使其与BSDsed
一起工作,您可能需要执行sed-e$'s/·和\\\n/g'
,如果我的实验有效,那么sed
脚本与BSDsed
因为\n
没有转换成换行符。@jaypalsingh:我在Mac OS X 10.9.5上的测试表明,1、2或3个反斜杠不适用于BSDsed
。不需要在一个符号中使用(&n)pattern@JonathanLeffler,您是否添加了$
?您不需要在此处使用-e来执行same@BallPython:你说得对,但我没有他-e
没有任何损害。这解决了我的问题,谢谢一帮Xorg。祝大家周末愉快!这一个看起来非常棒,简单。我通常坚持使用SED,但awk获得了我的兴趣。此外,我使用了“·”not“。字符,但我尝试了echo'con·grat·u·late'| awk-F·{print$2}“
它也可以工作。谢谢,节日快乐!仅供参考,使用非ascii字符时,您可能需要将它们括在单引号中。。。