如何在循环的特定行的末尾附加字符?

时间:2018-11-26 13:59:16

标签: bash

我想从一个文件中读取行号,并据此在另一个文件中插入字符。这是我到目前为止所得到的:

#!/bin/bash

character=:
line_number=1
sed $line_number's/$/ '$character'/' <readme >readme_new
line_number=3
sed $line_number's/$/ '$character'/' <readme_new >readme_newer

我现在想循环进行一次。

1 个答案:

答案 0 :(得分:2)

TL; DR:

$: c='!'
$: sed "s#\$# s/\$/ $c/#" fibs >script
$: sed -i "$(<script)" infile
  

淘汰-

行号文件:

$: cat fibs
1
2
3
5
8
13
21

要编辑的文件:

$: cat infile
  1 a
  2 b
  3 c
  4 d
  5 e
  6 f
  7 g
  8 h
  9 i
 10 j
 11 k
 12 l
 13 m
 14 n
 15 o
 16 p
 17 q
 18 r
 19 s
 20 t
 21 u
 22 v
 23 q
 24 x
 25 y
 26 z

3个步骤-如果要使用c haracter变量,请先进行设置。

$: c='!'

然后从行号文件创建脚本-

$: sed "s#\$# s/\$/ $c/#" fibs >script

它将创建:

$: cat script
1 s/$/ !/
2 s/$/ !/
3 s/$/ !/
5 s/$/ !/
8 s/$/ !/
13 s/$/ !/
21 s/$/ !/

使用简单的sed为每个行号添加一个sed替换命令,然后将生成的脚本发送到文件中。这里的一些技巧包括使用双引号来嵌入字符,并使用#来允许替换文本包含/,而不会从所有反斜杠引号中创建倾斜牙签综合症。

然后根据您的输入运行它-

$: sed -i "$(<script)" infile

哪个工作。这会将脚本文件内容提取出来供sed使用,生成:

  1 a !
  2 b !
  3 c !
  4 d
  5 e !
  6 f
  7 g
  8 h !
  9 i
 10 j
 11 k
 12 l
 13 m !
 14 n
 15 o
 16 p
 17 q
 18 r
 19 s
 20 t
 21 u !
 22 v
 23 q
 24 x
 25 y
 26 z

让我知道您是否想要对其进行调整。