【问题标题】:Append to end of line to specific lines附加到特定行的行尾
【发布时间】:2011-09-29 03:10:15
【问题描述】:

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

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

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

那么在知道了行号之后,如何在行尾追加一些文本呢?

每行要附加的文本会不断变化。

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

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

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

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

如果文件在那个位置,我有另一个脚本给出目录的名称。

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

例如,如果目录“somefolder1”和“somefolder2”中存在 a.c 和 c.c 文件(分别),则预期输出为:

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

【问题讨论】:

  • 这个太含糊了,举个输入和期望输出的例子。
  • 我为您格式化了您的代码。请使用格式代码按钮“{}”而不是&lt;code&gt;标签。

标签: shell unix sed awk


【解决方案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 是要保存的文件名。

【讨论】:

    【解决方案2】:

    试试这个:

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

    【讨论】:

    • 这也是我的建议。它怎么不起作用?你有哪个 sed 版本?
    【解决方案3】:

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

    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
    

    【讨论】:

    • 它给了我这个错误 Syntax Error The source line is 1. 错误上下文是 {if >>> (NR==${
    • SED 错误 sed: 0602-403 ${COUNTER}s/$/${FOLDER_NAME};/ 不是可识别的函数。
    • 在脚本中显示您运行 sed! 的部分。命令行上的语法与 shell 脚本中的语法不同。
    猜你喜欢
    • 2015-05-13
    • 2021-09-01
    • 2019-09-26
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 2014-11-15
    相关资源
    最近更新 更多