grep для $URL, затем sed $URL

Стандартное решение такой задачи — сделать две петли:

for i in $(<days); do
     for j in $(<hours); do
           grep "$i $j" file > data-"$i-$j"
     done
done

Обратите внимание, что я изменил обратные кавычки на $()для подстановки команд, убрал дохлых котов и добавил двойные кавычки.

-1
10.08.2019, 17:17
1 ответ

Кажется, нет никаких причин хранить данные в переменной.

awk -v OFS='">' '{ print $0, $0 }' 1.txt >2.txt

Это сделает то, что вы, кажется, хотите сделать, а именно вставит два символа ">в конце каждой строки, за которыми следует исходное содержимое строки. В этом коде это делается путем вывода строки в виде двух новых полей. Разделитель выходных полей OFSбудет вставлен между ними автоматически. Значение OFSустанавливается равным ">в командной строке.

В качестве альтернативы, используяsed:

sed 's/\(.*\)/\1">\1/' 1.txt >2.txt

При этом используется группа захвата для захвата всей строки. Затем он заменяется захваченным битом, строкой ">и снова захваченным битом.

Как указано в комментариях, еще более коротким вариантом будет

sed 's/.*/&">&/' 1.txt >2.txt

Когда &встречается в замещающей части команды s, он будет заменен битом ввода, соответствующим выражению. Выражение .*, поэтому &будет полной строкой,и &">&вставит строку дважды с ">в -между ними.


Ваш конвейер,

URL=$(grep ".*"./1.txt) | sed "s/$/\">${URL}/"./1.txt >./2.txt

не имеет особого смысла, так как левая и правая его части выполняются независимо друг от друга (и между ними нет связи ). Значение $URLбудет пустым в выражении sed.

Если бы вы использовали

URL=$(grep ".*"./1.txt); sed "s/$/\">${URL}/"./1.txt >./2.txt

, что совпадает с

URL=$(<./1.txt); sed "s/$/\">${URL}/"./1.txt >./2.txt

команда sedпопыталась бы вставить полное содержимое переменной $URL(всего1.txt)в конце каждой строки. Это также не удалось бы, так как это значение содержит несколько символов /, которые мешали бы разделителям /команды s.

2
28.01.2020, 05:08

Теги

Похожие вопросы