我正在编写一个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
答案 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