Regex 使用sed、awk等分隔中间点字符后的字符

Regex 使用sed、awk等分隔中间点字符后的字符,regex,bash,awk,sed,Regex,Bash,Awk,Sed,我需要你的帮助;我保证我真的很努力地寻找答案,但没有运气 我想在每个“·”(中间点)字符之间分隔文本 (基本上按音节) 上述代码输出: 骗局· 这是我想要的第一部分,但最终我希望输出: con· 格拉特· u· 迟 这将涉及获取介于第1-2次和第2-3次出现的“·”之间的字符 如果有人能给我指引正确的方向,我会非常感激,我会自己解决剩下的问题 编辑 很抱歉,我没有正确显示所需的输出。不过,你的解决方案效果很好 由于将所有内容保持为一行对我来说很重要,我将如何输出第一个点和第二个点之间的文本,以输

我需要你的帮助;我保证我真的很努力地寻找答案,但没有运气

我想在每个“·”(中间点)字符之间分隔文本 (基本上按音节)

上述代码输出:

骗局·

这是我想要的第一部分,但最终我希望输出:

con·
格拉特·

这将涉及获取介于第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.)在我们几个人已经回答了您最初的问题之后,最好再问另一个问题。您的更改使我们的回答无效,以使其与BSD
sed
一起工作,您可能需要执行
sed-e$'s/·和\\\n/g'
,如果我的实验有效,那么
sed
脚本与BSD
sed
因为
\n
没有转换成换行符。@jaypalsingh:我在Mac OS X 10.9.5上的测试表明,1、2或3个反斜杠不适用于BSD
sed
。不需要在一个符号中使用(&n)pattern@JonathanLeffler,您是否添加了
$
?您不需要在此处使用-e来执行same@BallPython:你说得对,但我没有他
-e
没有任何损害。这解决了我的问题,谢谢一帮Xorg。祝大家周末愉快!这一个看起来非常棒,简单。我通常坚持使用SED,但awk获得了我的兴趣。此外,我使用了“·”not“。字符,但我尝试了
echo'con·grat·u·late'| awk-F·{print$2}“
它也可以工作。谢谢,节日快乐!仅供参考,使用非ascii字符时,您可能需要将它们括在单引号中。。。