如何使用 sed 定位一个字符串,并在该字符串后添加来自另一个文件的文本?
文件 1:
stage ('Clone Repo31') {
steps {
git credentialsId: '', url: '/stash/scm/'
}
}
stage ('Zip Repo31') {
steps {
sh"""
tar --exclude='*.tar' -cvf .tar *
"""
}
}
steps {
git credentialsId: '', url: '/stash/scm/'
}
}
stage ('Zip Repo32') {
steps {
sh"""
tar --exclude='*.tar' -cvf .tar *
"""
}
}
文件 2:
randomRepo.git
differentRandomRepo.git
我希望能够使用 sed 读取第二个文件,并在每次出现 stash/scm/后添加第二个文件中每一行的内容
期望的输出:
stage ('Clone Repo31') {
steps {
git credentialsId: '', url: '/stash/scm/randomRepo.git'
}
}
stage ('Zip Repo31') {
steps {
sh"""
tar --exclude='*.tar' -cvf .tar *
"""
}
}
steps {
git credentialsId: '', url: '/stash/scm/differentRandomRepo.git'
}
}
stage ('Zip Repo32') {
steps {
sh"""
tar --exclude='*.tar' -cvf .tar *
"""
}
}
这可以用 sed 完成吗?我在从列表文件中读取它时遇到问题,而且它很困惑,因为它有很多斜线。我已经能够使用正常的 sed 替换,但我不知道如何通过读取另一个文件来进行替换。
请您参考如下方法:
在下文中,我提出了一个几乎纯粹的 sed
解决方案。
sed
有一个用于读取文件的 r
命令,因此原则上您可以使用它来读取 file2
。但是,没有后续命令会影响从文件中读取的行,因此我想不出有任何方法可以有效地使用 r
命令来执行您的要求。
但是,如果 file1
和 file2
都在 sed
的输入中给出,那么解决方案是可能的。
下面为了区分这两个文件,我放了一个标记行(-----
),我想当然的不在file2
;但是,它可以位于 file1
中的任何位置而不会产生任何问题。
cat file2 <(echo '-----') file1 | sed -f script.sed
其中 script.sed
如下:
1{ # only on line 1
:a # begin while
/-----/!{ # while the line does not contain the marker
N # append the following line
ba # end while
} # here the pattern space is a multiline containing the list
s/\n-----// # remove the last newline and the marker
h # put the multiline in the hold space
d # delete, as we don't want to print anything so far
} # that's it, lines from 1 to the marker are processed
/stash\/scm\//{ # for lines matching this pattern
G # we append the full hold space
s/'\n\([^\n]*\)/\1'/ # and position the first entry in the list appropriately
x # then we swap pattern and hold space
s/[^\n]*\n// # remove the first element of the list
x # and swap again
} # now the hold space has one item less