Вопрос:

Bash - как поставить каждую строку в цитате

linux bash shell text

20451 просмотра

7 ответа

181 Репутация автора

Я хочу поставить каждую строку в кавычки, такие как:

abcdefg
hijklmn
opqrst

преобразовать в:

"abcdefg"
"hijklmn"
"opqrst"

Как это сделать в скрипте оболочки Bash?

Автор: Bing.Physics Источник Размещён: 07.06.2013 07:18

Ответы (7)


6 плюса

170867 Репутация автора

Используйте sed:

sed -e 's/^\|$/"/g' file

Требуется больше усилий, если файл содержит пустые строки.

Автор: choroba Размещён: 07.06.2013 07:21

31 плюса

1840 Репутация автора

Использование awk

awk '{ print "\""$0"\""}' inputfile

Используя чистый Bash

while read FOO; do
   echo -e "\"$FOO\""
done < inputfile

где inputfileбудет файл, содержащий строки без кавычек.

Если в вашем файле есть пустые строки, определенно стоит использовать awk :

awk 'NF { print "\""$0"\""}' inputfile

NFуказывает awkна выполнение команды печати только в том случае, если число полей больше нуля (строка не пустая).

Автор: blue Размещён: 07.06.2013 07:22

3 плюса

11635 Репутация автора

Я думаю, что sed и awk - лучшее решение, но если вы хотите использовать только shell, это небольшой скрипт для вас.

#!/bin/bash

chr="\""
file="file.txt"
cp $file $file."_backup"
while read -r line
do
 echo "${chr}$line${chr}"
done <$file > newfile
mv newfile $file
Автор: grepit Размещён: 07.06.2013 07:22

5 плюса

564955 Репутация автора

Этот sed также должен работать для игнорирования пустых строк:

sed -i.bak 's/^..*$/"&"/' inFile

или же

sed 's/^.\{1,\}$/"&"/' inFile
Автор: anubhava Размещён: 07.06.2013 07:59

2 плюса

3997 Репутация автора

paste -d\" /dev/null your-file /dev/null

(не самый красивый, но, вероятно, самый быстрый)

Теперь, если входные данные могут содержать кавычки, вам может потребоваться экранировать их с помощью обратной косой черты (а затем и обратной косой черты), например:

sed 's/["\]/\\&/g; s/.*/"&"/' your-file
Автор: Stephane Chazelas Размещён: 07.06.2013 09:19

10 плюса

619 Репутация автора

Я использую следующую команду:

xargs -I{lin} echo \"{lin}\" < your_filename

xargsВзять стандартный ввод (перенаправлено из файла) и передать одну строки один раз в {lin}заполнитель, а затем выполнить команду в следующем, в этом случае echoс уцелевшими в двойных кавычках.

Вы можете использовать -iопцию xargs, чтобы опустить имя заполнителя, например так:

xargs -i echo \"{}\" < your_filename

В обоих случаях ваш IFS должен иметь значение по умолчанию или '\n'как минимум.

Автор: 0zkr PM Размещён: 25.03.2014 12:26

0 плюса

31 Репутация автора

Я использовал sed с двумя выражениями для замены начала и конца строки, так как в моем конкретном случае использования я хотел разместить HTML-теги только вокруг строк, содержащих определенные слова.

Поэтому я искал строки, содержащие слова, содержащиеся в blaпеременной в текстовом файле, inputfileи заменил на начало <P>и конец на конец </P>(ну, на самом деле я сделал более длинные HTML-теги в реальной работе, но это будет хорошо служить примером)

Похожий на:

$ bla=foo
$ sed -e "/${bla}/s#^#<P>#" -e "/${bla}/s#\$#</P>#" inputfile
<P>foo</P>
bar
$
Автор: DOK Размещён: 26.08.2015 01:38
Вопросы из категории :
32x32