多行文本轉(zhuǎn)成一行的實(shí)現(xiàn)方法
不知道你們有沒有遇到過下面的情況,以我為例
有時(shí)候我會(huì)收到批量操作服務(wù)器的需求,且我會(huì)拿到一個(gè)服務(wù)器 ip 列表,它是一個(gè)多行的形式,如下所示
# ip 列表192.168.0.1
192.168.0.2
192.168.0.3
192.168.0.4
192.168.0.5
192.168.0.6
但我使用 saltstack 進(jìn)行批量操作時(shí),我需要將上面的多行 ip 轉(zhuǎn)成一行的形式才能執(zhí)行 saltstack 命令
192.168.0.1,192.168.0.2,192.168.0.3,192.168.0.4,192.168.0.5,192.168.0.6# saltstack 批量操作命令例子 salt -L '192.168.0.1,192.168.0.2,192.168.0.3,192.168.0.4,192.168.0.5,192.168.0.6' cmd.run 'ls -l'
如果是少量 ip,直接手動(dòng)操作就行;如果 ip 數(shù)量特別多,手動(dòng)轉(zhuǎn)換的話就特別的麻煩了
下面我將介紹兩個(gè)比較常見的多行文本轉(zhuǎn)一行的實(shí)現(xiàn)方法,如果大家有更好的方法的話,歡迎大家積極討論參與!
shell 命令實(shí)現(xiàn)
tr
?命令
tr
?命令用于轉(zhuǎn)換或刪除文本中的字符,我們可以通過?tr --help
?來查看它的幫助文檔
下面是一些關(guān)于?tr
?命令的例子
#替換字符echo "hello" | tr 'o' 'a' ? # 輸出結(jié)果:hella#刪除字符echo "hello" | tr -d 'l' ? # 輸出結(jié)果:heo#壓縮連續(xù)字符:echo "hello" | tr -s 'l' ? # 輸出結(jié)果:helo
知道了這個(gè)命令的大概用法之后,我們就可以通過?tr
?命令來實(shí)現(xiàn)多行轉(zhuǎn)一行
#命令如下:cat <<EOF | tr '\n' ','
192.168.0.1
192.168.0.2
192.168.0.3
192.168.0.4
192.168.0.5
192.168.0.6
EOF
上面的命令可以分為兩個(gè)部分,第一部分如下:
#第一部分cat <<EOF
192.168.0.1
192.168.0.2
192.168.0.3
192.168.0.4
192.168.0.5
192.168.0.6
EOF
使用?
cat
?命令和?<<EOF
?結(jié)構(gòu),它指示將下面的文本內(nèi)容作為輸入傳遞給?cat
?命令EOF
:終止符,用于標(biāo)識(shí)輸入的結(jié)束
EOF在Linux中是一種約定的標(biāo)記,用于指示輸入的結(jié)束,它在不同的上下文中有不同的用途
在Here Document結(jié)構(gòu)中,EOF用于標(biāo)記輸入文本的開始和結(jié)束;在文件輸入中,EOF用于表示輸入的結(jié)束
有關(guān) Here Document 內(nèi)容:Here Document and Here String | Baeldung on Linux
上面命令輸出如下:

接下來我們來看第二部分
#第二部分tr '\n' ','
使用?tr
?命令,它將?'\n'
?(換行符)替換為逗號(hào)?','
?。tr
?命令用于字符轉(zhuǎn)換,'\n'
?是被替換的字符,','
?是替換的字符
第一部分和第二部分通過管道符?|
?連接起來,表示將?cat
?命令的輸出傳遞給?tr
?命令處理
我們來看下輸出結(jié)果

Notepad++ 實(shí)現(xiàn)
這個(gè)方法適用于在 Windows 系統(tǒng),用 Notepad 實(shí)現(xiàn)
把多行 IP 復(fù)制到 Notepad 中,然后選中內(nèi)容——>輸入查找目標(biāo)和替換內(nèi)容——>點(diǎn)擊全部替換(注意下面的查找模式換成正則表達(dá)式)

\r\n
?表示換行符,(.+)
表示匹配任意字符,且至少匹配一次\1
?表示引用查找到的文本,,
?表示逗號(hào)
需要注意的是,替換換行符之前你得先知道文本內(nèi)容中的換行符是 Windows 格式(\r\n
) 還是 UNIX 格式(\n
)
