Как я могу добавить строку к началу каждой строки в файле?

У меня есть следующий код bash, который перебирает текстовый файл по строкам.. im пытается префикс префикса работы каждой строки, но вместо этого я получаю эту ошибку:

[email protected]:~/Desktop$ ./appendToFile.sh stusers.txt kp
stusers.txt
kp
./appendToFile.sh: line 11: /bin/sed: Argument list too long
[email protected],passw0rd

Это сценарий bash.

#!/bin/bash

file=$1
string=$2

echo "$file"
echo "$string"

for line in 'cat $file'
do
    sed -e 's/^/prefix/' $line
    echo "$line"
done < $file

Что я здесь делаю неправильно?

Обновление: Выполнение главы в файле сбрасывает все строки на одну строку терминала, возможно, связано?

[email protected]:~/Desktop$ head stusers.txt
[email protected]:~/Desktop$ ouse.com,passw0rd

Ответ 1

однолинейная команда awk также должна сделать трюк:

awk '{print "prefix" $0}' file

Ответ 2

Относительно вашей первоначальной ошибки:

. /appendToFile.sh: строка 11: /bin/sed: список аргументов слишком длинный

Проблема в этой строке кода:

sed -e 's/^/prefix/' $line

$line в этом контексте - это имя файла, с которым работает sed. Чтобы исправить свой код, вы должны исправить эту строку следующим образом:

echo $line | sed -e 's/^/prefix/'

(Также обратите внимание, что ваш исходный код не должен иметь < $file в конце.)

Уильям Перселл правильно решает эту проблему в обоих своих предложениях.

Тем не менее, я считаю, что вы правильно определили, что существует проблема с вашим исходным текстовым файлом. dos2unix не исправит эту проблему, так как он только удаляет каретку, возвращающую стики Windows в конце строк. (Однако, если вы пытаетесь прочитать файл Linux в Windows, вы получите огромную строку без возврата.)

Если предположить, что проблема не связана с символами конца строки в текстовом файле, сработают ответы Уильяма Перселла, Энди Лестера или нулевой революции.

Вариант с предложением while read...:

while read -r line; do  echo "PREFIX " $line; done < $file

Это можно запустить непосредственно из оболочки (нет необходимости в пакетном/скриптовом файле):

while read -r line; do echo "kp" $line; done < stusers.txt

Ответ 3

Весь цикл может быть заменен одной командой sed, которая работает со всем файлом:

sed -e 's/^/prefix/' $file

Ответ 4

Perl способ сделать это будет:

perl -p -e's/^/prefix' filename

или

perl -p -e'$_ = "prefix $_"' filename

В любом случае, который считывает из filename и печатает префиксные строки в STDOUT.

Если вы добавите флаг -i, Perl изменит файл на месте. Вы также можете указать несколько имен файлов, и Perl волшебным образом сделает все из них.

Ответ 5

Вместо цикла for, более целесообразно использовать while read...:

while read -r line; do
do
    echo "$line" | sed -e 's/^/prefix/'
done < $file

Но вам было бы намного лучше с более простым:

sed -e 's/^/prefix/' $file

Ответ 6

Используйте sed. Просто измените prefix слова.

sed -e 's/^/prefix/' file.ext

Если вы хотите сохранить вывод в другом файле

sed -e 's/^/prefix/' file.ext > file_new.ext

Ответ 7

Вам не нужен sed, просто конкатенируйте строки в команде echo

while IFS= read -r line; do
    echo "prefix$line"
done < filename

Ваша петля перебирает каждое слово в файле:

for line in 'cat file'; ...