Ответ 1
однолинейная команда awk также должна сделать трюк:
awk '{print "prefix" $0}' file
У меня есть следующий код 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
однолинейная команда awk также должна сделать трюк:
awk '{print "prefix" $0}' file
Относительно вашей первоначальной ошибки:
. /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
Весь цикл может быть заменен одной командой sed, которая работает со всем файлом:
sed -e 's/^/prefix/' $file
Perl способ сделать это будет:
perl -p -e's/^/prefix' filename
или
perl -p -e'$_ = "prefix $_"' filename
В любом случае, который считывает из filename
и печатает префиксные строки в STDOUT.
Если вы добавите флаг -i
, Perl изменит файл на месте. Вы также можете указать несколько имен файлов, и Perl волшебным образом сделает все из них.
Вместо цикла for, более целесообразно использовать while read...
:
while read -r line; do
do
echo "$line" | sed -e 's/^/prefix/'
done < $file
Но вам было бы намного лучше с более простым:
sed -e 's/^/prefix/' $file
Используйте sed. Просто измените prefix
слова.
sed -e 's/^/prefix/' file.ext
Если вы хотите сохранить вывод в другом файле
sed -e 's/^/prefix/' file.ext > file_new.ext
Вам не нужен sed, просто конкатенируйте строки в команде echo
while IFS= read -r line; do
echo "prefix$line"
done < filename
Ваша петля перебирает каждое слово в файле:
for line in 'cat file'; ...