Добавить в конец строки к определенным строкам - PullRequest
1 голос
/ 28 сентября 2011

Я пишу сценарий оболочки и мне нужна помощь.

Этот скрипт примет имя файла в качестве входного и изменит этот входной файл в соответствии с некоторой логикой.

Теперь этот файл будет изменен только в определенных строках, хотя я узнаю номер строки.

Итак, узнав номер строки, как добавить текст в конец этой строки?

Добавляемый текст будет изменяться для каждой строки.

Пример: входные файлы содержат список имен файлов.

Входной файл - abc.txt, с содержанием:

a.c;
b.c;
c.c;
d.c;

Этот abc.txt вводится в скрипт, скрипт должен выбрать имена файлов из abc.txt и проверить, где файлы присутствуют в указанном каталоге.

У меня есть другой скрипт, который дает имя каталога, если файл находится в этом месте.

Если вывод другого скрипта - это какое-то имя папки, он должен изменить входной файл.

Например, если файлы a.c и c.c присутствуют в директориях 'somefolder1' и 'Somefolder2' (соответственно), то ожидаемый результат будет:

a.c;somefolder1;
b.c;
c.c;somefolder2;
d.c;

Я использую логику:

MAX_LINES=`wc -l ${CHECKOUT_FILE}.tmp |awk '{print $1}'`
COUNTER=0

#Logic
while [ $COUNTER -ne $MAX_LINES ]
do
    COUNTER=`expr $COUNTER + 1`
    LINE_READ=`sed -n ${COUNTER}p ${CHECKOUT_FILE}.tmp`
    PROGRAM_NAME=`echo $LINE_READ | cut -f 1 -d ";" `
    FOLDER_NAME=`${CLEARCASE}/somescript.sh ${PROGRAM_NAME} ${CHECKOUT_COUNTRY}`

    if [ $FOLDER_NAME = 'NOTFOUND' ] ; then
        echo $FOLDER_NAME
        continue
    else
        sed -e '${COUNTER}s/$/${FOLDER_NAME};/' < ${CHECKOUT_FILE}.tmp > temp.txt
    fi
done

Ответы [ 3 ]

1 голос
/ 28 сентября 2011

Попробуйте это:

$ linenum=4
$ sed -e "${linenum}s/\$/text to add/" < input.txt > output.txt
1 голос
/ 28 сентября 2011

Я не знаю, как это сделать в sh, но я написал небольшой скрипт на Python:

#!/usr/bin/env python
import sys


mapping = {
    2: 'second',
    4: 'fourth',
}


def main(src, dst):
    with open(src, 'r') as f:
        lines = f.readlines()
    new_lines = process(lines)
    with open(dst, 'w') as f:
        f.write(''.join(new_lines))


def process(lines):
    for l, s in mapping.items():
        lines[l+1] = '%s %s\n' % (lines[l+1].rstrip('\n'), s)
    return lines


if __name__ == '__main__':
    main(sys.argv[1], sys.argv[2])

Это просто в использовании: сначала вы определяете отображение в верхней части скрипта, где у вас есть

line_number: 'text to append'

пар. Затем сохраните скрипт как append.py и запустите его как

python append.py src dst

где src - это имя файла, который вы хотите обработать, dst - это имя файла для сохранения.

0 голосов
/ 28 сентября 2011

Вы можете включить это в цикл как

awk '{if(NR==<your line number>)print $0,<your additional text>;else print}' your_file >>temp_file
rm your_file
mv temp_file your_file

NR обозначает номер строки в awk. Поэтому мы проверяем NR == допустим, строка 3. если NR равен 3,
выведите $ 0 «ваш текст» $ 0 - это полная строка, к которой будет добавлен текст если не строка 3, else {print} - это напечатает всю строку.

Или более простая форма в sed:

pearl[ncm_o11.2_int.@].525> cat file1
a
b
c
d
e
f
pearl[ncm_o11.2_int.@].526> sed '1s/$/vijay/g' file1
avijay
b
c
d
e
f

Эта команда sed добавит в конец строки нужный текст.

'<line_number>s/search/replace'
'     1        s/  $   / vijay  '  

вот решение awk:

pearl[ncm_o11.2_int.@].534> awk '{if(NR==1)print $0,"vijay";else print}' file1
a vijay
b
c
d
e
f
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...