Shell 附加到行尾到特定行

Shell 附加到行尾到特定行,shell,unix,sed,awk,Shell,Unix,Sed,Awk,我正在写一个shell脚本,需要一些帮助 此脚本将文件名作为输入,并将根据某些逻辑修改该输入文件 现在,这个文件将只修改特定的行,但我会知道行号 所以在知道行号之后,我如何在行尾添加一些文本 每行要追加的文本将不断更改 示例:输入文件包含文件名列表 输入文件为abc.txt,内容为: a.c; b.c; c.c; d.c; 此abc.txt是脚本的输入,脚本应从abc.txt中提取文件名,并检查文件在指定目录中的位置 我有另一个脚本,如果文件在那个位置,它会给出目录的名称 如果其他脚本的输出是

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

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

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

所以在知道行号之后,我如何在行尾添加一些文本

每行要追加的文本将不断更改

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

输入文件为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
MAX_line=`wc-l${CHECKOUT_FILE}.tmp | awk'{print$1}'`
计数器=0
#逻辑
而[$COUNTER-ne$MAX_行]
做
计数器=`expr$计数器+1`
行_READ=`sed-n${COUNTER}p${CHECKOUT_FILE}.tmp`
PROGRAM_NAME=`echo$LINE_READ | cut-f1-d”`
文件夹名称=`${CLEARCASE}/somescript.sh${PROGRAM\u NAME}${CHECKOUT\u COUNTRY}`
如果[$FOLDER_NAME='NOTFOUND'];然后
echo$FOLDER\u名称
持续
其他的
sed-e'${COUNTER}s/$/${FOLDER_NAME};/'<${CHECKOUT_FILE}.tmp>temp.txt
fi
完成

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

您可以将其包含在循环中,如

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
此sed命令将在行尾追加所需的文本

'<line_number>s/search/replace'
'     1        s/  $   / vijay  '  
试试这个:

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

这太模糊了,请给出输入和所需输出的示例。我为您格式化了代码。请使用格式化代码按钮“
{}
”而不是
标记。它给了我这个错误语法错误源代码行是1。错误上下文为{if>>>(NR=${SED error SED:0602-403${COUNTER}s/$/$${FOLDER_NAME};/不是可识别的函数。请在脚本中显示运行sed的部分。命令行上的语法将与shell脚本中的语法不同。这也是我的建议。它是如何工作的?您有哪个sed版本?
pearl[ncm_o11.2_int.@].534> awk '{if(NR==1)print $0,"vijay";else print}' file1
a vijay
b
c
d
e
f
$ linenum=4
$ sed -e "${linenum}s/\$/text to add/" < input.txt > output.txt