5

Например, file1 содержит:

entry1:value1
entry2:value2
entry3:value3

Теперь я хочу добавить префикс "file1:" к каждой строке:

file1:entry1:value1
file1:entry2:value2
file1:entry3:value3

Как я могу сделать это в одной командной строке?

Я использую Bash.

Кстати, ведущий пробел должен быть сохранен, поэтому встроенная строка чтения Bash не работает для меня.

7 ответов7

8
% sed 's/^/file1:/' file1
2

Используя AWK, вы можете добавить практически любой префикс:

awk -v PRE='anything:' '{$0=PRE$0; print}' file1

Это будет работать даже для модных непечатаемых символов.

2

Наиболее читаемый и легкий для запоминания вариант добавления префикса и суффикса :

$ echo "  foo bar  " | awk '{print "--"$0"++"}'

какие выводы

  --  foo bar  ++

Обратите внимание, что весь ввод, включая начальные / конечные пробелы, сохраняется.

1

read разделение по $IFS , поэтому сначала вы должны очистить его.

while IFS= read line
do
  echo "file1:$line"
done
1

Экранирование специальных символов:

printf -v prefix %q 'ab\cd%;,: /{][}-+*'; prefix=${prefix////\\/}; sed "s/^/$prefix/" file
1

AWK эквивалент ответа sed:

awk '{gsub(/^/,"file1:")}1' file

Или просто:

awk '{$0="file:1"$0}1' file
0

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

$ foo=$(echo -e "\r'{}[]- \`~^&%$=@\!#\"")
$ echo $foo | od -c
0000000  \r   '   {   }   [   ]   -       `   ~   ^   &   %   $   =   @
0000020   \   !   #   "  \n
0000025
$ export foo

Итак, чтобы добавить их в начало и конец каждой строки файла bar.txt:

perl -ne 'chomp; print "$ENV{foo}:$_:$ENV{foo}\n"' bar.txt

Хеш %ENV содержит переменные окружения пользователя (поэтому я и экспортирую $foo выше). Специальная переменная $_ содержит текущую строку, а chomp удаляет из нее завершающую новую строку:

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