多行文字轉成一行的實現方法

2023-07-10 21:01:00

哈嘍大家好,我是鹹魚

不知道你們有沒有遇到過下面的情況,以我為例

有時候我會收到批次操作伺服器的需求,且我會拿到一個伺服器 ip 列表,它是一個多行的形式,如下所示

# 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 進行批次操作時,我需要將上面的多行 ip 轉成一行的形式才能執行 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,直接手動操作就行;如果 ip 數量特別多,手動轉換的話就特別的麻煩了

下面我將介紹兩個比較常見的多行文字轉一行的實現方法,如果大家有更好的方法的話,歡迎大家積極討論參與!

shell 命令實現

tr 命令

tr 命令用於轉換或刪除文字中的字元,我們可以通過 tr --help 來檢視它的幫助檔案

下面是一些關於 tr 命令的例子

#替換字元
echo "hello" | tr 'o' 'a'   # 輸出結果:hella

#刪除字元
echo "hello" | tr -d 'l'   # 輸出結果:heo

#壓縮連續字元:
echo "hello" | tr -s 'l'   # 輸出結果:helo

知道了這個命令的大概用法之後,我們就可以通過 tr 命令來實現多行轉一行

#命令如下:
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

上面的命令可以分為兩個部分,第一部分如下:

#第一部分
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 結構,它指示將下面的文字內容作為輸入傳遞給 cat 命令
  • EOF:終止符,用於標識輸入的結束

EOF在Linux中是一種約定的標記,用於指示輸入的結束,它在不同的上下文中有不同的用途

在Here Document結構中,EOF用於標記輸入文字的開始和結束;在檔案輸入中,EOF用於表示輸入的結束

有關 Here Document 內容:Here Document and Here String | Baeldung on Linux

上面命令輸出如下:

接下來我們來看第二部分

#第二部分
tr '\n' ','

使用 tr 命令,它將 '\n' (換行符)替換為逗號 ','tr 命令用於字元轉換,'\n' 是被替換的字元,',' 是替換的字元

第一部分和第二部分通過管道符 | 連線起來,表示將 cat 命令的輸出傳遞給 tr 命令處理

我們來看下輸出結果

Notepad++ 實現

這個方法適用於在 Windows 系統,用 Notepad 實現

把多行 IP 複製到 Notepad 中,然後選中內容——>輸入查詢目標和替換內容——>點選全部替換(注意下面的查詢模式換成正規表示式)

  • \r\n 表示換行符,(.+) 表示匹配任意字元,且至少匹配一次
  • \1 表示參照查詢到的文字,, 表示逗號

需要注意的是,替換換行符之前你得先知道文字內容中的換行符是 Windows 格式(\r\n) 還是 UNIX 格式(\n