附加到特定行的行尾

时间:2011-09-28 05:22:16

标签: shell unix sed awk

我正在编写一个shell脚本,需要一些帮助。

此脚本将文件名作为输入,并将根据某些逻辑修改该输入文件。

现在,这个文件只会修改特定的行,我会知道行号。

因此,在了解行号后,如何将一些文本附加到该行的末尾?

要追加的文字将不断更改每一行。

示例:输入文件包含文件名列表。

输入文件是abc.txt,内容为:

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

这个abc.txt是脚本的输入,脚本应该从abc.txt中获取文件名并检查文件在指定目录中的位置。

我有另一个脚本,如果文件位于该位置,则会提供目录的名称。

如果其他脚本的输出是某个文件夹名称,那么它应该修改输入文件。

例如,如果a.c和c.c文件存在于dirctory“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 个答案:

答案 0 :(得分:1)

我不知道如何在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是要保存的文件名。

答案 1 :(得分:1)

试试这个:

$ linenum=4
$ sed -e "${linenum}s/\$/text to add/" < input.txt > output.txt

答案 2 :(得分:0)

你可以把它包含在像

这样的循环中
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} - 这将打印整行。

或者更简单的形式:

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