LINUX.ORG.RU

Помогите разработать несложный скрипт(неско строк)


0

0

Помогите пожалуйсто написать небольшой скрипт. Никак не получается

Для заданных файлов (вводятся с клавы) заменить строку с заданным номером (тоже с клавы) на другую строку (тоже с клавы).

Если по простому: 1. Все файлы (имя с клавы). 2. Заменить строку с номером $n (введено с клавы) на другую строку $s (тоже от пользователя).

Заранее благодарен!

script = inputString >>= (\fn -> inputInteger >>= replaceLine fn)

Написание функций inputString, inputInteger и replaceLine 
оставляется читателю в качестве домашнего задания :-)

Begemoth ★★★★★
()

#!/bin/sh


tempname()
{
dd if=/dev/urandom bs=1k count=1 2>/dev/null | md5sum | awk '{print $1;}'
}

substn()
{
f="$1"
n="$2"
s="$3"
tmp=/tmp/`tempname`

i=1

while read line ; do
if [ $i -eq $n ] ; then
echo $s
else
echo $line
fi
i=`expr $i + 1`
done < $f > $tmp

# Validate:
l1=`wc -l $f | awk '{print $1;}'`
l2=`wc -l $tmp | awk '{print $1;}'`

if [ $l1 -eq $l2 ] ; then
mv -f $tmp $f
else
echo "Error!" 1>&2
echo "File: $tmp" 1>&2
fi
}

substn test 3 "Blah, blah, blah"

# substn работает для одного файла, ввод/вывод делать не буду :)

rymis ★★
()
Ответ на: комментарий от rymis

Спасибо огромное! Щас проверю. Вывод не нужн, главное чтобы он заменял строку в файлах с нужными номером на нашу строку (в скрипте которая).

Martiner
() автор топика

Самый простой вариант, без всяких проверок:

# Файлы вводятся через пробел
echo -n "Files: "
read FILES
FILES=`echo $FILES | strings`
for MYFILE in $FILES; do
echo -n "String num: "
read SNUM
sed -n "$SNUM s/.*/&/p" < $MYFILE
echo -n "Sub string: "
read SUBSTR
sed "$SNUM s/^.*$/$SUBSTR/" < $MYFILE > SOMEFILE_$MYFILE
done

stwm
()

#! /bin/bash

echo "file names:"
read fnames

echo "line number:"
read num

echo "new string:"
read str

for fname in $fnames; do
    lines="`wc -l $fname| cut -d' ' -f1`"
    head -$[$num-1] $fname
    echo $str
    tail -$[$lines-$num] $fname
done


Дальнейшая доработка - самостоятельно.

anonymous
()
Ответ на: комментарий от anonymous

Точнее:

#! /bin/bash

echo "file names" read fnames

echo "line number" read num

echo "new string" read str

for fname in $fnames; do lines="`wc -l $fname| cut -d' ' -f1`"

head -$[$num-1] $fname > /tmp/scripttmp echo $str >> /tmp/scripttmp tail -$[$lines-$num] $fname >> /tmp/scripttmp mv /tmp/scripttmp $fname done

А дальше - man mktemp, man bash/IFS.

anonymous
()
Ответ на: комментарий от php-coder

#!/bin/sh

echo -n "Name of file: "
read FILE

echo -n "Number of line: "
read LINE

echo -n "Substitution string: "
read STRING

sed -i "${LINE}c\
$STRING" $FILE

sdio ★★★★★
()
Ответ на: комментарий от Pi

http://haskell.org/haskellwiki/Homework_help:

Even if someone does it for you, their solution may not help you or may even be subtly wrong. Some people are deliberately cruel to people who ask for homework questions the wrong way; some just like the mental challenge of producing a correct but unhelpful answer.

Begemoth ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.