Как найти содержимое посередине с помощью sed? - PullRequest
0 голосов
/ 10 марта 2020

Я хотел бы найти слова с этим шаблоном u'sometext ', желаемый результат будет только некоторый текст, например:

u'amy', u'1', u'bob', u'2',

Это становится:

amy 1 bob 2

Я пытался sed -e 's/u'\''\(^*\)'\'',/\1/g' file.txt но это не работает. Могу я спросить, где я ошибся?

Ответы [ 2 ]

1 голос
/ 10 марта 2020

Это может сработать для вас (GNU sed):

sed 's/u'\''\([^'\'']*\)'\'',\?/\1/g' file

Этот ответ для полноты, так как принятый ответ совершенно адекватен.

При окружении команд sed одинарными кавычками ', если команда содержит одинарную кавычку, отверстие должно быть пробито до базовой оболочки, т.е. закрыть существующую команду ', вставить одиночную заключите в кавычки из оболочки \', а затем откройте оставшиеся команды '.

Иногда, окружив команды sed двойными кавычками (что также позволяет оболочке интерполировать переменные, например), можно получить неожиданные результаты, например: <<<'!' sed "s/!/X/", где bash расширение истории вызывается. Решение, которое я нашел, состоит в том, чтобы всегда заключать команды sed в одинарные кавычки, и такие проблемы не возникают (за счет длинных одинарных кавычек!).

1 голос
/ 10 марта 2020

Я не полностью уверен в том, что вы надеялись получить с помощью шаблона ^*, который, как мне кажется, равен нулю или более вхождений начального текстового якоря.

Вы можете использовать команду sed в следующем тексте для достижения желаемых результатов:

pax$ echo "u'amy', u'1', u'bob', u'2'," | sed -e "s/u'\([^']*\)',/\1/g"
amy 1 bob 2

* [^']* в скобках захвата будет в основном захватывать все после ' до следующего '. Вы также заметите, что я переключился на использование двойной кавычки " для окружения команды sed. Это упрощает экранирование, которое вам нужно сделать внутри строки, если она использует одинарные кавычки.

Это также меняет то, что оболочка может сделать с вашей строкой, но в этом случае вы не используете ничего, что shell может интерпретировать.


Вы также можете избежать захвата, если решите удалить только то, что вам не нужно, вместо того, чтобы заменить то, что вам не нужно и вещи, которые вы хотите, с вещами, которые вы хотите (a) . Это будет go что-то вроде:

pax$ echo "u'amy', u'1', u'bob', u'2'," | sed -e "s/u'//g" -e "s/', */ /g"
amy 1 bob 2

(a) Возможно, мое самое мучительное использование "Lingua Anglais" , которые я наносил в течение нескольких десятилетий - вероятно, меня должны посадить в тюрьму за преступления против Энгли sh: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...