Предполагается:
- Вы хотите разбить линию на левой части
(
. - Левой части может предшествовать и / или следовать пробел. (Судя по вашим данным, между
aux
и следующей левой парой нет пробелов)
Тогда как насчет awk
решения:
str="ps aux( sort ( more"
awk -F ' *\\( *' '{ for (i=1; i<=NF; i++) print $i}' <<< "$str"
Вывод:
ps aux
sort
more
- Опция
-F
определяет разделитель поля ввода. - Шаблон
' *\\( *'
- это регулярное выражение, которое сопоставляет левую часть с 0 или более пробелами перед и / или после него.
Если мое предположение неверно, пожалуйста, сообщите мне.
[РЕДАКТИРОВАТЬ]
Если вы предпочитаете C
решение, следующий код поможет при запуске:
#include <regex.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main(void)
{
regex_t preg;
char *string = "ps aux( sort ( more";
char *pattern = " *\( *"; // regex of the delimiter
char out[256]; // output buffer
int rc;
size_t nmatch = 1;
regmatch_t pmatch[1];
// compile the regex
if (0 != (rc = regcomp(&preg, pattern, 0))) {
printf("regcomp() failed, returning nonzero (%d)\n", rc);
exit(EXIT_FAILURE);
}
// loop while the regex of delimiter is found
while (0 == (rc = regexec(&preg, string, nmatch, pmatch, 0))) {
strncpy(out, string, pmatch[0].rm_so); // copy the substring to print
out[pmatch[0].rm_so] = 0; // terminate the string
printf("%s\n", out);
string += pmatch[0].rm_eo; // seek the pointer to the start of the next token
}
// print the last remaining portion
if (strlen(string) > 0) {
printf("%s\n", string);
}
regfree(&preg);
return 0;
}
[Объяснение]
Если regexec()
завершится успешно, он возвращает "начальную позицию соответствующей подстроки" в pmatch[0].rm_so
и «рядом с конечной позицией совпадающей подстроки» в pmatch[0].rm_eo
следующим образом:
1st call of regexec()
string: ps aux( sort ( more
^ ^
rm_so rm_eo
Мы можем интерпретировать их следующим образом: pmatch[0].rm_so
содержит длину 1-го токена, а pmatch[0].rm_eo
указывает начальную позицию следующего токена Затем мы обновляем переменные и вызываем 2-е regexec()
:
2nd call of regexec()
string: sort ( more
^ ^
rm_so rm_eo
Мы повторяем l oop до тех пор, пока regexec()
не вернет ненулевое значение, что означает отсутствие соответствия. Тогда последний токен останется в string
.