2

在 Linux 中使用 shell 脚本(bash 或 csh)。我想找到与给定文本模式匹配的所有行,并为每一行添加或附加(取决于应用程序)文本到下一行。

例如,对于包含如下行的文件:

HEADER 1
 12345

HEADER 2
 12345

HEADER 1
 12345

HEADER 2
 12345

如果我正在搜索“HEADER 1”,并想附加文本“ABCDE”,输出将是这样的:

HEADER 1
 12345 ABCDE

HEADER 2
 12345

HEADER 1
 12345 ABCDE

HEADER 2
 12345

我也有一些情况,我希望 ABCDE 在 12345 之前。

我一直试图了解 sed 用于此目的的用法,但我感到受阻。任何指针将不胜感激。

4

3 回答 3

4

试试这个命令:

sed '/HEADER 1/{n;s/$/ ABCDE/}' input.txt

这是逻辑:

for each line in 'input.txt'    
    if line matches /HEADER 1/
        read next line
        append string ' ABCDE'
    endif    
endfor
于 2013-08-20T00:24:47.847 回答
1

sed 是用于在单行上进行简单替换的出色工具,对于其他任何事情,只需使用 awk 来实现可移植性、可扩展性、简单性、可读性等:

$ awk 'found{print $0, "ABCDE"; found=0; next} {print} /HEADER 1/{found=1}' file
HEADER 1
 12345 ABCDE

HEADER 2
 12345

HEADER 1
 12345 ABCDE

HEADER 2
 12345

并且预先挂起只是“ABCDE”和$ 0的明显切换顺序:

$ awk 'found{print "ABCDE", $0; found=0; next} {print} /HEADER 1/{found=1}' file
HEADER 1
ABCDE  12345

HEADER 2
 12345

HEADER 1
ABCDE  12345

HEADER 2
 12345

如果您使用 s、g、p(带 -n)以外的 sed 语言结构,那么您使用的工具是错误的,因为在 1970 年代中期,当 awk 被发明时,所有其他 sed 语言结构都已过时。

如果您对此表示怀疑,请尝试修改产生上述输出的 sed 脚本以执行其他任何操作,例如,打印在每行末尾添加 ABCDE 的次数。这是awk:

$ awk 'found{print $0, "ABCDE", ++count; found=0; next} {print} /HEADER 1/{found=1}' file
HEADER 1
 12345 ABCDE 1

HEADER 2
 12345

HEADER 1
 12345 ABCDE 2

HEADER 2
 12345

我不敢想象 sed 做这么简单的事情会是什么样子。

于 2013-08-20T13:04:48.393 回答
0

如果您对一般的文本管道 linux 应用程序感到困惑,我建议您在 Learn Linux the Hard Way 课程中完成这个练习。应该需要 4-5 分钟,并有很大帮助。

于 2013-08-20T00:22:13.833 回答