Обведите каждую строку одинарной кавычкой, кроме пустых строк - PullRequest
4 голосов
/ 22 апреля 2019

Моя цель - добавить один апостроф к каждой строке в файле и пропустить пустые строки.

file.txt :

Quote1
Quote2

Quote3

Пока что яиспользовали sed:

sed -e "s/\(.*\)/'\1'/"

, который выполняет работу, но создает апострофы также в пустых строках:

'Quote1'
'Quote2'
''
'Quote3'

Моя цель:

'Quote1'
'Quote2'

'Quote3'

Как я могу добиться этого, используя sed, или, может быть, это должен быть awk.

Ответы [ 6 ]

6 голосов
/ 22 апреля 2019

.* означает zero or more characters, вы хотите 1 or more characters, что в любом седе будет ..*:

$ sed "s/..*/'&'/" file
'Quote1'
'Quote2'

'Quote3'

Вы также можете записать это регулярное выражение как .\+ в GNU sed, .\{1,\} в SOS POSIX и .+ в GNU или OSX / BSD sed при вызове с -E.

Выше предполагается, что строки всех пробелов должны быть заключены в кавычки. Если это не так, то:

$ sed "s/.*[^[:blank:]].*/'&'/" file
'Quote1'
'Quote2'

'Quote3'

В любом awk, предполагая, что строки всех пробелов должны быть заключены в кавычки:

$ awk '/./{$0="\047" $0 "\047"}1' file
'Quote1'
'Quote2'

'Quote3'

иначе:

$ awk 'NF{$0="\047" $0 "\047"}1' file
'Quote1'
'Quote2'

'Quote3'

Вы можете увидеть разницу между этими словами:

$ printf '   \n' | sed "s/..*/'&'/"
'   '
$ printf '   \n' | sed "s/.*[^[:blank:]].*/'&'/"

$ printf '   \n' | awk '/./{$0="\047" $0 "\047"}1'
'   '
$ printf '   \n' | awk 'NF{$0="\047" $0 "\047"}1'

$
1 голос
/ 22 апреля 2019

Другой sed

sed '/^$/!{s/^/\x27/;s/$/\x27/}' file

В приведенном выше скрипте написано

  • Ищите пустую строку - /^$/ - шаблон.
  • Для этих строккоторый не следует описанному выше шаблону (!), замените начало (^) и конец ($) одинарными кавычками (\x27).
1 голос
/ 22 апреля 2019

Предполагая, что вы хотите добавить одинарные кавычки в строки, которые не содержат ничего, кроме пробелов:

sed -E "/./s/(.*)/'\1'/"
1 голос
/ 22 апреля 2019

В одну сторону:

awk '$1{$0 = q $0 q}1' q="'" file

Добавить кавычки, только если 1-й столбец ($1) имеет какое-либо значение.1 для печати каждой строки.

0 голосов
/ 22 апреля 2019

попробовал на GNU SED

sed -E "s/\S+/'&'/" file.txt
0 голосов
/ 22 апреля 2019

Вы можете использовать perl, чтобы проверить наличие негативного взгляда, утверждая, что вы не будете соответствовать "пустой" строке:

perl -pe 's/(?<!$)(.*)/"\1"/' file

Другой альтернативой является более конкретное выражение в вашем регулярном выражении, как предложил @edmorton в своем ответе.

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