我使用此命令來獲取在拉取請求中更改的所有檔案的串列。
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
注意單|。
另外,請盡可能簡化命令。
編輯:所有檔案的名稱中都沒有空格或換行符。
uj5u.com熱心網友回復:
你也可以這樣做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 ...)
uj5u.com熱心網友回復:
你可以試試這個git... | awk解決方案:
git diff --name-only HEAD master |
awk '{printf "%sfile:%s", (NR>1?"||":""), $0} END{print ""}'
或者更漂亮的awk解決方案(也適用于 BSD/Mac awk):
git diff --name-only HEAD master |
awk -v RS= -v OFS='||' '{$1=$1} 1'
uj5u.com熱心網友回復:
使用sed
$ git diff --name-only HEAD master| sed s'/^/file:/;:a;N;s/\n/||file:/;ba'
file:my/repo/file1.java||file:my/repo/file3.java||file:my/repo/file5.java
uj5u.com熱心網友回復:
$ git diff --name-only HEAD master |
awk '{printf "%sfile:%s", sep, $0; sep="||"} END{if (sep) print ""}'
file:my/repo/file1.java||file:my/repo/file3.java||file:my/repo/file5.java
以上:
- 在沒有輸入的情況下不會列印空行,它不會產生任何輸出,并且
- 不會將整個輸入讀入記憶體,它一次只讀取 1 行,并且
- 使用強制性 POSIX 工具 awk,沒有不可移植的擴展。
uj5u.com熱心網友回復:
既然您在 Mac 上,不妨使用zsh它而不是其古老的過時版本bash(加上不使用額外的行程或程式,只是zsh替換):
#!/usr/bin/env zsh
#data=$(git diff --name-only HEAD master)
data="my/repo/file1.java
my/repo/file3.java
my/repo/file5.java"
typeset -a files=( "${(@f)data}" ) # Split on newlines
combined=${(j:||:)files[@]/#/file:} # Add file: to every element and join with ||
# file:my/repo/file1.java||file:my/repo/file3.java||file:my/repo/file5.java
print "$combined"
uj5u.com熱心網友回復:
分隔符paste串列是要用于列的連續單字符分隔符串列。
$ paste -d 'abc' <(seq 0 3) <(seq 3 6) <(seq 6 9) <(seq 9 12)
0a3b6c9
1a4b7c10
2a5b8c11
3a6b9c12
有一個簡單的技巧 - 您可以paste使用單字符分隔符制作連接線,然后用您想要的多字符替換單個字符。
git diff --name-only HEAD master | paste -sd '|' | sed 's/|/||/g'
您還可以使用 bash 將換行符替換為||. 有趣的事實:命令替換$(..)洗掉了尾隨的換行符。
a=$(git diff --name-only HEAD master); echo "${a//$'\n'/||}"
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/493709.html
上一篇:Sed為特定模式的列添加顏色?
下一篇:將文本從scp捕獲到變數或陣列
