替换shell脚本或sed中的单词

时间:2015-01-10 17:16:00

标签: bash shell awk sed

我是新手,但想创建一个执行以下操作的脚本。

假设我有一个

形式的文件
This is line1
This is line2
This is line3

This is line4
This is line5
This is line6

我想以

的形式替换它
\textbf{This is line1}
This is line2
This is line3

\textbf{This is line4}
This is line5
This is line6

也就是说,在段落的开头,我想添加一个文字\textbf{,并以}结束这一行。有没有办法搜索线的双端?我在使用sed创建这样的脚本时遇到了麻烦。谢谢!

3 个答案:

答案 0 :(得分:2)

使用awk你可以编写像

这样的东西
$ awk '!f{ $0 = "\\textbf{"$0"}"; f++} 1; /^$/{f=0}' input
\textbf{This is line1}
This is line2
This is line3

\textbf{This is line4}
This is line5
This is line6

它的作用是什么?

  • !f{ $0 = "\\textbf{"$0"}"; f++}

    • !f如果f的值为0,则为真。对于第一行,由于未设置f的值,因此将评估为true。如果是真的,则awk执行动作部分{}

    • $0 = "\\textbf{"$0"}"\textbf{}添加到该行

    • f++会增加f的值,以便它可能不会进入此操作部分,除非f设置为零

  • 1始终为True。由于缺少操作部分,awk执行默认操作以打印整行

  • /^$/模式匹配空行

    • {f=0}如果该行为空,则设置f=0,以便第一个操作部件修改下一行以包含更改

答案 1 :(得分:0)

使用sed的方法

sed '/^$/{N;s/^\(\n\)\(.*\)/\1\\textbf{\2}/};1{s/\(.*\)/\\textbf{\1}/}' my_file

找到所有只有换行符的行,然后添加下一行。 ==

^$/{N;s/^\(\n\)\(.*\)/\1\\textbf{\2}/}

标记空白行下方的行并进行修改

找到文件中的第一行并执行相同的操作== 1{s/\(.*\)/\\textbf{\1}/}

答案 2 :(得分:0)

只需使用awk的段落模式:

$ awk 'BEGIN{RS="";ORS="\n\n";FS=OFS="\n"} {$1="\\textbf{"$1"}"} 1' file
\textbf{This is line1}
This is line2
This is line3

\textbf{This is line4}
This is line5
This is line6