Как использовать sed для замены u'sometext 'на' sometext '

У меня есть файл с текстом. Я просто хочу удалить ведущую букву u из всех экземпляров u'sometext', чтобы она оставила 'sometext'. Я не смог понять, как заставить sed соответствовать на u' и заменить на '.

Команда Sed, хотя я бы сработала:

echo ['a', u'update for microsoft office 2013 (kb4022166) 32-bit edition', 'unknown', 'null'] | sed "s/u'/'/g"

выход:

[a, uupdate for microsoft office 2013 (kb4022166) 32-bit edition, unknown, null]

что я хотел:

['a', 'update for microsoft office 2013 (kb4022166) 32-bit edition', 'unknown', 'null']

Еще примеры того, что находится в файле:

"[u'cpe:/o:microsoft:windows_7::sp1:x64-enterprise', u'cpe:/a:adobe:acrobat:11.0.19']"

Что бы я хотел иметь:

"['cpe:/o:microsoft:windows_7::sp1:x64-enterprise', 'cpe:/a:adobe:acrobat:11.0.19']"

пожалуйста, нажмите редактировать и добавьте код, который вы пробовали ... Кроме того, добавление нескольких строк образца (скажем, 2-5 с составленными данными) вместе с полным ожидаемым результатом поможет добавить ясности, а также поможет в тестировании решений ... из-за отсутствия информации ... подробности см. в stackoverflow.com/help/mcve

Sundeep 10.08.2018 17:08
0
1
68
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Попробуйте, если возможно, что-то вроде этого:

echo "['a', u'update for microsoft office 2013 (kb4022166) 32-bit edition', 'unknown', 'null']" | sed "s/u'/'/g"

ВЫХОД:

['a', 'update for microsoft office 2013 (kb4022166) 32-bit edition', 'unknown', 'null']

Кажется, что он не воспринимает всю строку целиком, а принимает ее как несколько.

Проблема была в моей тестовой строке, в файле строка заключена в двойные кавычки, а моя эхо-строка - нет, это объясняет, почему она не работает так, как я ожидал. Спасибо.

JediKid 10.08.2018 17:41
Ответ принят как подходящий

Вам нужно будет использовать границы слов, обозначенные специальным символом \b, который идет непосредственно перед первым элементом, который должен совпадать на границе.

 $ echo "[u'a', u'hello']" | sed "s/\bu'/'/g"
 ['a', 'hello']

Итак, в данном случае одна проблема: "[u'hello ', u'hulu']" -> "['hello', 'hul']"

JediKid 10.08.2018 17:44

@JediKid, я понял, что перепутал, где идет \b. Поместите его вперед, и проблема хулу исчезнет

Edward Minnix 10.08.2018 17:51

Потрясающий! Спасибо!

JediKid 10.08.2018 17:53

Это не очень надежно, например echo "[u'version 7-u']" | sed "s/\bu'/'/g" -> ['version 7-']

Ed Morton 12.08.2018 16:53
$ echo "[u'a', u'hello', u'version 7-u']" | sed "s/u\('[^']*'\)/\1/g"
['a', 'hello', 'version 7-u']

$ echo "['a', u'update for microsoft office 2013 (kb4022166) 32-bit edition', 'unknown', 'null']" | sed "s/u\('[^']*'\)/\1/g"
['a', 'update for microsoft office 2013 (kb4022166) 32-bit edition', 'unknown', 'null']

$ echo "[u'cpe:/o:microsoft:windows_7::sp1:x64-enterprise', u'cpe:/a:adobe:acrobat:11.0.19']" | sed "s/u\('[^']*'\)/\1/g"
['cpe:/o:microsoft:windows_7::sp1:x64-enterprise', 'cpe:/a:adobe:acrobat:11.0.19']

Однако обратите внимание, что как приведенный выше, так и принятый в настоящее время ответ не удастся, если у вас может быть u в конце строки, разделенной одиночными кавычками, ранее в строке. например.:

$ echo "['u', 'a']" | sed "s/u\('[^']*'\)/\1/g"
['', 'a']

$ echo "['u', 'a']" | sed "s/\bu'/'/g"
['', 'a']

Итак, предполагая, что это проблема, мы можем использовать более надежный подход с awk (в данном случае с использованием GNU awk для multi-char RS и RT):

$ echo "['u', 'a']" | awk -v RS="'[^']*'" -v ORS= 'RT{sub(/u$/,"")} {print $0 RT}'
['u', 'a']

$ echo "[u'a', u'hello', u'version 7-u']" | awk -v RS="'[^']*'" -v ORS= 'RT{sub(/u$/,"")} {print $0 RT}'
['a', 'hello', 'version 7-u']

Другие вопросы по теме