Linux下如何用一个指定的字符串去分割另一个字符串?

例如,现在有一个字符串“abc@#123@#def@456@#ghi#789”,希望以字符串“@#”对其分隔,即分隔后的结果为:abc123def@456ghi#789我... 例如,现在有一个字符串“abc@#123@#def@456@#ghi#789”,希望以字符串“@#”对其分隔,即分隔后的结果为:
abc
123
def@456
ghi#789

我尝试用cut -d"@#" -f[n]的方式去分隔,但cut命令的分隔符只能是1个字符,无法支持字符串。
请问Linux有什么命令可以实现以上功能呢?谢谢!
展开
 我来答
kaixingui2012
2015-10-28 · TA获得超过4.2万个赞
知道大有可为答主
回答量:1.4万
采纳率:81%
帮助的人:6501万
展开全部

Linux下可以用strstr()函数定位子串所在的位置,用来实现用子串分隔一个字符串。man strstr可以看函数相关介绍

$ man strstr
NAME
       strstr - locate a substring

SYNOPSIS
       #include <string.h>

       char *strstr(const char *haystack, const char *needle);
DESCRIPTION
       The  strstr()  function finds the first occurrence of the substring needle in the string haystack.  The terminating `\0' characters are not compared.
       strstr()函数实现从haystack串中,查找第一次出现的needle子串,只比较有效字符,结束符\0不算在内。

如:

#include <stdio.h>
#include <string.h>
int main()
{
    char s[]="abc@#123@#def@456@#ghi#789";
    char sub[]="@#";
    char *pc,*pb;
    pb=pc=s ; //pb指向字符串头
    while( pc=strstr(pc,sub) ) //查找匹配字符串位置
    {
        *pc='\0'; //置字符串结束符
        puts(pb); //输出当前字符串
        pc+=strlen(sub); //跳过分隔符串
        pb=pc; //pb指向新的起始位置
    }
    if ( pb )
        puts(pb);
    return 0;
}
videlord
2014-01-06 · TA获得超过1336个赞
知道大有可为答主
回答量:1518
采纳率:66%
帮助的人:442万
展开全部
好多方法,如下提供3种:
#!/bin/sh

mystr="abc@#123@#def@456@#ghi#789"

echo "method 0: pure shell"
str1=$mystr
while [ $str1 != ${str1#*@#} ]
do
echo ${str1%%@#*}
str1=${str1#*@#}
done
echo $str1
echo " "

echo "method 1: awk"
echo $mystr | awk 'gsub("@#","\n")'
echo " "

echo "method 2: sed"
echo $mystr | sed "s/@#/\\n/g"
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
QICHUAN_ZHANG
2014-01-06 · TA获得超过199个赞
知道小有建树答主
回答量:1646
采纳率:0%
帮助的人:555万
展开全部
可以使用AWK 和cut,也可以使用C语言来实现,方法很多的额, 当然最好的还是使用shell命令来解决。发私信吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
活宝电脑爱好者
2014-01-06 · TA获得超过129个赞
知道答主
回答量:135
采纳率:0%
帮助的人:56.3万
展开全部
为什么不适用awk?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式