我非常精通使用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
但是我继续收到“未知命令:@”错误。
我在网上找不到任何内容,在如何克服这一问题的手册中也找不到。任何帮助将不胜感激!
答案 0 :(得分:0)
r
命令前可以添加零个或一个地址。
Sed地址
地址不是必需的,但如果指定地址,则必须是一个数字(用于对输入文件中的输入行进行累加计数),美元(
'$'
)字符 寻址输入的最后一行或上下文地址(由正则表达式组成,后跟定界符)。
您的示例未使用数字或$
作为地址说明符。剩下的唯一选项是用定界符括起来的正则表达式。 regex
中sed
的默认定界符是正斜杠(/
)。
由于/
是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是您感兴趣的字符串。