Это также просто с несколькими значениями. Во-первых, вы можете пропустить команду cat в вашем канале, так как sed будет читать из файла и печатать его вывод в STDOUT
. И sed
работает так, как это описал @Philippos (и \1
будет использоваться дважды, так как он принадлежит первой группе захвата). Просто удалите эхо в команде xargs, чтобы запустить вашу команду. Если вы хотите увидеть вызванную команду, вы можете добавить параметр -t
, чтобы увидеть команду, или -p
, чтобы выполнить ее в интерактивном режиме. Поэтому вам нужно указать да/нет перед запуском команды.
user@pc:/tmp$ cat inputfile.txt
input-prefix1:value1
input-prefix:value
input-prefix2:value2
user@pc:/tmp$ sed 's/^input-prefix:\(.*\)$/replace1-prefix:\1\nreplace2-prefix:\1/g' inputfile.txt
input-prefix1:value1
replace1-prefix:value
replace2-prefix:value
input-prefix2:value2
user@pc:/tmp$ sed 's/^input-prefix:\(.*\)$/replace1-prefix:\1\nreplace2-prefix:\1/g' inputfile.txt | xargs -r echo my-command
Краткое примечание: предполагается, что ваш входной префикс — это первое, что вы хотите заменить в строке, а значение — это вся остальная часть строки после двоеточия. Также модификатор g
в команде sed
заменит все вхождения вашего input-prefix:
в inputfile.txt
.
Другое возможное решение (, предполагающее, что в каждом файле всегда один столбец ), будет:
paste name.file lastname.file id.file |xargs printf 'the id of the %s %s is %d\n'
Или только с awk
и без ограничений по столбцам:
awk '{ getline name<"name.file"; getline lastname<"lastname.file"}
{ print "the Id of the", name, lastname, "is", $0 }' OFS=' ' id.file
Использование программы из библиотеки Icon (символьный -язык манипулирования в смысле SNOBOL):
# Utility functions: print-as-echo, print-line-with-visual-space.
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }
pl " Input data files" data?
head data?
pl " Expected output:"
head -v $E
# Insert strings like:
# The ID of the Josh Smith is 1
pl " Results:"
icon-paste "-The ID of the " data2 "- " data3 "- is " data1 |
tee f1
pl " Verify results if possible:"
C=$HOME/bin/pass-fail
[ -f $C ] && $C f1 "$E" || ( pe; pe " Results cannot be verified." ) >&2
производство:
-----
Input data files data1 data2 data3
==> data1 <==
1
2
3
==> data2 <==
Josh
Kate
Chris
==> data3 <==
Smith
Jones
Black
-----
Expected output:
==> expected-output <==
The ID of the Josh Smith is 1
The ID of the Kate Jones is 2
The ID of the Chris Black is 3
-----
Results:
The ID of the Josh Smith is 1
The ID of the Kate Jones is 2
The ID of the Chris Black is 3
-----
Verify results if possible:
-----
Comparison of 3 created lines with 3 lines of desired results:
Succeeded -- files (computed) f1 and (standard) expected-output have same content.
Это было в такой системе, как:
OS, ker|rel, machine: Linux, 3.16.0-7-amd64, x86_64
Distribution : Debian 8.11 (jessie)
Некоторые подробности о значке -paste (lam.icn):
icon-paste paste, join, laminate lines from files. (man)
Path : ~/executable/icon-paste
Version : - ( local: ~/executable/icon-paste, 2012-02-11 )
Length : 24 lines
Type : POSIX shell script executable (binary data)
Shebang : #!/bin/sh
Home : https://www2.cs.arizona.edu/icon/library/src/progs/lam.icn (doc)
Информацию о Icon можно найти по адресу:
https://www2.cs.arizona.edu/icon/
С наилучшими пожеланиями... ура, дрл
В одну сторону:
paste name.file lastname.file id.file | awk -F '\t' '{printf "The ID of the %s %s is %d\n", $1,$2,$3}'
Используйте awk
для получения необходимого форматирования.