使用sed“ r”搜索文本并附加文件内容

时间:2019-02-27 23:34:37

标签: sed string-substitution

我非常精通使用sed的内联函数,以及它的替代功能以及使用不同字符作为其功能的分隔符的能力,但是现在我发现自己使用“ r”函数添加了sed在目标文件中找到一个字符串后,附加文件的内容。我相信这称为“零地址或一个地址”命令。

很简单,如果一个名为“ letters”的文件包含

abc
def
ghi

“数字”包含

123

然后使用

sed -i "def r numbers" letters

导致“字母”变成

abc
def
123
ghi

所以,我的问题是:如果“字母”包含正斜杠会怎样?例如,letters2包含:

/abc/def/ghi
/def/ghi/jkl
/ghi/jkl/mno

,我想在“ / def / ghi / jkl”字符串后附加“数字”吗?最初,人们认为一个简单的

sed -i '/def/ghi/jkl r numbers' letters2

就足够了,但是当然使用正斜杠,会使事情变得更加复杂,考虑到这会导致“命令后有多余字符”错误。看起来在这种情况下,您不能像在事物的替换面那样表示符号。我已经尝试过(以多种不同方式):

sed -i '@/def/ghi/jkl@ r numbers' letters2

但是我继续收到“未知命令:@”错误。

我在网上找不到任何内容,在如何克服这一问题的手册中也找不到。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

r命令前可以添加零个或一个地址。

来自documentation of sed

  

Sed地址

     

地址不是必需的,但如果指定地址,则必须是一个数字(用于对输入文件中的输入行进行累加计数),美元('$')字符    寻址输入的最后一行或上下文地址(由正则表达式组成,后跟定界符)。

您的示例未使用数字或$作为地址说明符。剩下的唯一选项是用定界符括起来的正则表达式。 regexsed的默认定界符是正斜杠(/)。

由于/regex的分隔符,因此{@ {1}}中/的任何用法都必须转义(即,以regex开头)。
您需要的命令是:

\

要为正则表达式使用其他定界符(以避免转义正斜杠),当用作开放定界符时(在地址之前),必须在其前面加上反斜杠。在sed -i '/\/def\/ghi\/jkl/ r numbers' letters2 之后使用它时,请勿转义它。将其转义到regex内将告诉regex使用其字面意思。

在这种情况下,命令为:

sed

您声称运行的示例(sed -i '\@/def/ghi/jkl@ r numbers' letters2 )不遵循该模式,并且实际上不起作用(至少在我正在使用的macOS sed -i "def r numbers" letters上)。
应该是sed,或者更确切地说,应该是sed -i "/def/ r numbers" letters

答案 1 :(得分:0)

sed非常适合s / old / new,但对于其他任何东西,只需使用awk:

$ awk 'NR==FNR{new=new $0 ORS; next} {print} $0=="/def/ghi/jkl"{printf "%s", new}' numbers letters
/abc/def/ghi
/def/ghi/jkl
123
/ghi/jkl/mno

以上内容可在任何UNIX框的任何shell中的任何awk中工作,以处理任何输入文件的任何内容。它只是通过一次读取numbers一行并进行连接来创建一个名为“ new”的变量,然后读取letters并打印当前行,如果当前行则打印new的内容line是您感兴趣的字符串。