bash - 多行输出到带分隔符字符串的单行连接

标签 bash awk sed paste

我使用此命令获取拉取请求中已更改的所有文件的列表。

git diff --name-only HEAD master

示例输出:

my/repo/file1.java
my/repo/file3.java
my/repo/file5.java

我想将此输出转换为以下内容:

file:my/repo/file1.java||file:my/repo/file3.java||file:my/repo/file5.java

这样我就可以仅对 IntelliJ IDEA 中的这些文件运行代码分析。

到目前为止我尝试了什么?

git diff --name-only HEAD master |  sed -e 's/^/file:/'  | paste -s -d "||" -

这给了我以下输出:

file:my/repo/file1.java|file:my/repo/file3.java|file:my/repo/file5.java

注意单个 |

此外,请尽可能简化命令。

编辑:所有文件的名称中都不会有空格或换行符。

最佳答案

您也可以使用 awk 来完成

git diff --name-only HEAD master |
awk 'NR > 1 {printf("||")} {printf("file:%s",$0)} END{print ""}'

这个 awk 的作用是:

  • 对于所有输入行但第一行,输出:||
  • 对于所有输入行,输出:file: + <input line content>
  • 当没有更多的输入行可读时,输出一个换行字符

备注: END{print ""}当你做 out=$(git .. | awk ...) 时是没有返回的

关于bash - 多行输出到带分隔符字符串的单行连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72668447/

相关文章:

linux - 将 AWK 应用于具有相同扩展名的文件集

linux - 如何在 GNU sed 中结束 `i` 命令?

sed - sed/awk-在ldif转储中删除空格/连接行

linux - 通过 Bash 从文本文件中删除空行,包括空格字符

bash - bash 是否可以优雅地完成通过 gzip 传送的命令?

bash - awk 中 shell 变量的用法

sed - 在字符对之间插入空格 - sed

mysql - 从 cron 作业执行 bash 脚本时出现 "/bin/bash^M: bad interpreter: No such file or directory"错误

linux - 为 map 服务器安装 gd 库时出错

sed - grep/sed : How to print *something* when nothing matches