Я хочу заменить 5-ю строку нескольких текстовых файлов (file1.txt, file2.txt, file3.txt, file4.txt) на строку «Доброе утро», используя одну команду терминала.
] Все текстовые файлы расположены на моем ~/Desktop.
Примечание. Мой рабочий стол состоит из 6 файлов .txt. Я хочу применить изменение только к вышеупомянутым 4 текстовым файлам.
Вы можете использовать sed:
sed '5s/^/Good morning /' file
добавит Good morning в пятую строку файла.
Если вы хотите заменить содержимое в строке 5 вместо этого скажите:
sed '5s/.*/Good morning/' file
Если вы хотите сохранить изменения в файле на месте, используйте параметр -i:
sed -i '5s/.*/Good morning/' file
sed может обрабатывать более одного файла за раз. Вы можете просто добавить больше имен файлов в конец команды. Вы также можете использовать расширения bash для соответствия определенным файлам:
# manually specified
sed -i '5s/.*/Good morning/' file1.txt file2.txt file3.txt file4.txt
# wildcard: all files on the desktop
sed -i '5s/.*/Good morning/' ~/Desktop/*
# brace expansion: file1.txt, file2.txt, file3.txt, file4.txt
sed -i '5s/.*/Good morning/' file{1..4}.txt
Здесь вы можете узнать больше о расширениях скобок.
GNU awk версии 4.1.0 и выше, с , можно прочитать больше о расширениях скобок здесь , которые позволяют редактировать на месте. Поэтому вы можете сказать:
gawk -i inplace 'NR==5{$0="Good morning"}7' file
заменить строку # 5 в файле на Good morning!
Я не видел решение python, так вот:
import sys
import os
def open_and_replace(filename):
with open(filename) as read_file:
temp = open("/tmp/temp.txt","w")
for index,line in enumerate(read_file,1):
if index == 5:
temp.write("NEW STRING\n")
else:
temp.write(line.strip() + "\n")
temp.close()
os.rename("/tmp/temp.txt",filename)
for file_name in sys.argv[1:]:
open_and_replace(file_name)
Основная идея заключается в том, что для каждого файла, предоставленного в командной строке в качестве аргумента, мы выписываем временный файл и перечисляем каждую строку в исходном файле. Если индекс строки равен 5, мы выписываем строку, которая отличается. Остальное просто заменяет старый файл временным файлом. Demo:
$> ls
file1.txt file2.txt file3.txt
$> cat file1.txt
line 1
line 2
line 3
line 4
GOOD MORNING
line 6
$> python ~/replace_5th_line.py file1.txt file2.txt file3.txt
$> cat file1.txt
line 1
line 2
line 3
line 4
NEW STRING
line 6
$> cat file2.txt
line 1
line 2
line 3
line 4
NEW STRING
line 6
То же самое может быть достигнуто при понимании списка. Ниже приведен однострочный шрифт одного и того же сценария:
cat /etc/passwd | python -c 'import sys; print "\n".join(["CUSTOM" if index == 5 else line.strip() for index,line in enumerate(sys.stdin,1)])'
или без cat
python -c 'import sys; print "\n".join(["CUSTOM" if index == 5 else line.strip() for index,line in enumerate(sys.stdin,1)])' < /etc/passwd
. Осталось просто перенаправить вывод отредактированного содержимого в другой файл с > output.txt
Вы можете использовать Vim в режиме Ex:
for b in 1 2 3 4
do
ex -sc '5c|Good Morning' -cx file"$b".txt
done
5 выбрать 5-ю строку c заменить текст x записать, если были сделаны изменения (есть) и выйти из [!d1 ] Ниже приведен сценарий bash, который завершает процесс perl, предложенный в этом ответе
/ tmp / it
console:
enabled:false
Тогда запустите следующее:
$ search_and_replace_on_line_of_file.sh false true 2 /tmp/it
, и файл теперь содержит
/ tmp / it
console:
enabled:true
function show_help()
{
IT=$(CAT <<EOF
usage: SEARCH REPLACE LINE_NUM FILE
e.g.
false true 52 /tmp/it -> replaces false with true on line 52 of file /tmp/it
)
echo "$IT"
exit
}
if [ "$1" == "help" ]
then
show_help
fi
if [ -z "$4" ]
then
show_help
fi
SEARCH_FOR=$1
REPLACE_WITH=$2
LINE_NO=$3
FILE_NAME=$4
perl -i -pe "s/$SEARCH_FOR/$REPLACE_WITH/ if $.==$LINE_NO" $FILE_NAME