3

Скажем, у меня есть какая-то команда, которая выводит кучу строк. Вывод этой команды может выглядеть примерно так:

...
foo
bar
blargh
...

Скажем, у меня есть некоторая заданная строка

myString$Blah

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

...
myStringfooBlah
myStringbarBlah
myStringblarghBlah
...

Какой самый простой способ сделать это? (Предпочтительнее awk и sed)

3 ответа3

6

Тебе даже не нужен sed или awk .

xargs может сделать это: с помощью: -L1 -I '$' echo 'myString$Blah'

$ cat x.list
foo
bar
blargh
$ cat x.list | tr '\n' '\0' | xargs -0 -L1 -I '$' echo 'myString$Blah'
myStringfooBlah
myStringbarBlah
myStringblarghBlah
1

Вы можете сделать это полностью в оболочке (по крайней мере, bash ) без особых проблем. Вот скрипт, который делает это:

#!/bin/bash

pattern="$1"
input_file="$2"
output_file="$3"

saved_IFS="$IFS"
IFS=$'\n'
# Store each line of the input file into an array named 'lines'.
lines=($(< $input_file))
IFS="$saved_IFS"

# Truncate output file, if any.
cat /dev/null > $output_file

# Substitute each line into the pattern, and write to output file.
for ln in "${lines[@]}"
do
  echo ${pattern/$/$ln} >> $output_file
done

Предположим, что этот скрипт называется script , и у вас есть файл in.txt с одной строкой на строку, а затем запуск script in.txt out.txt даст вам желаемый результат в out.txt .

1

Предполагая, что вы можете использовать строку формата myString&Blah с амперсандом вместо знака доллара, направьте вывод в следующее:

sed "s/.*/$format/"

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

Важно использовать двойные кавычки, чтобы разрешить расширение строки формата.

Если вам действительно нужно использовать амперсанд, используйте это:

sed "s/.*/$(echo "$format" | tr '$' '&')/"

Кавычки вокруг $ format важны, если в строке есть пробел.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .