Використання тут-doc для `sed` та файлу


10

Я хочу використовувати тут-doc для команд sed і надавати файл для читання та вихідний файл.

Я переглянув тут Документи з посібника з розширеного сценарію Bash, але в ньому нічого не згадується про регулярні аргументи при використанні тут-doc. Чи можливо це навіть?

Я хотів би досягти чогось такого:

#!/bin/bash
OUT=/tmp/outfile.txt
IN=/my_in_file.txt

sed $IN << SED_SCRIPT
    s/a/1/g
    s/test/full/g

SED_SCRIPT 
> $OUT;

Будь-яка допомога дуже цінується.

Відповіді:


14

Ви можете сказати GNU sed читати скрипт зі стандартного введення з -f -, -fтобто читати сценарій з файлу, і -означає стандартне введення, як це прийнято з великою кількістю команд.

sed -f - "$IN" > "$OUT" << SED_SCRIPT
    s/a/1/g
    s/test/full/g
SED_SCRIPT

POSIX sed також підтримує -f, але використання -для стандартного введення не задокументоване. У цьому випадку ви могли б використовувати /dev/stdinв системах Linux (і я, мабуть, нагадую, Solaris також має це, але я не можу це підтвердити зараз)

Використання <<-SED_SCRIPT(з префіксом '-') дозволить SED_SCRIPTвідступити тег закриття .


Дякую, що ви сказали, що працювало, як ніколи я хотів би зазначити, що маркер закриття не може бути відступним, інакше це спричиняє помилку в баші, я припускаю, що це тому, що він також включає пробіл у закритому.
Трістіан

Зауважте, що Apple OS X sed не підтримує читання сценарію зі стандартного вводу. (Принаймні, не таким чином чи будь-яким іншим документально підтвердженим чином.)
Данртон

@danorton: Я додав рішення , яке не потребує підтримки -f -в sedале вона вимагає заміни процесу: <( command ).
pabouk

5

У разі , якщо sedне підтримує читання сценарію з stdin( з допомогою -f -), ви можете використовувати процес заміни (доступні в bash, zsh, ksh93):

sed "$IN" > "$OUT" -f <( cat << SED_SCRIPT
    s/a/1/g
    s/test/full/g
SED_SCRIPT)

Дужки, що закриваються, )повинні слідувати кінцевому роздільнику ( SEC_SCRIPT) відразу або після нового рядка. У разі заміни процесу ви також можете використовувати echoзамість документа тут:

sed "$IN" > "$OUT" -f <( echo \
"    s/a/1/g
    s/test/full/g" )

1
У Mac OS X йому не сподобався вхідний файл ( "$IN"або навіть testfile.txt) відразу після самої команди sed - він хотів -e scriptабо -f file. Перестановка відповіді @pabouk працювала на мене:sed -f <( cat << ETC ... ETC) "$IN" > "$OUT"
Stephen P

На Max OSX з bash 4.2.45 та стандартним BSD sed, дужки , що закриваються, повинні були знаходитись у новому рядку нижче закриття SED_SCRIPT.
Олександр Климечек

-1

Можливо, приємніший підхід:

OUT=/dev/stdout

IN=my_in_file.txt
sed -s 's/in/out/' < $IN > $OUT
  -or-
sed -s 's/in/out/' > $OUT < $IN

IN=my_in_text
sed -s 's/in/out/' <<< $IN > $OUT
  -or-
sed -s 's/in/out/' > $OUT <<< $IN

:)


1
Цікаво, але крім пункту. ОП хоче передавати команди sed через stdin.
муру

Такий підхід дозволяє обидва способи, навіщо знищення?
Магнус

Повторіть: "передайте команди sed через via stdin". Ви відповідаєте, це не робить жодним методом.
муру
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.