我試圖用破折號、方括號和冒號分隔符分割以下文本字串,但將它們保留在方括號中
輸入:
10:100 - [10/09/21:12:23:22]
期望的輸出:
100, 10/09/21:12:23:22
我當前的代碼:
awk -F '[- ":]' '{print $1, $2, $3, $4, $5}'
uj5u.com熱心網友回復:
第一種解決方案:使用 GNUawk,您可以嘗試以下代碼。
awk '
match($0,/:([^[:space:]] )[[:space:]] -[[:space:]] \[([^]]*)\]/,arr){
print arr[1],arr[2]
}
' Input_file
第二種解決方案:使用sed'ss(替換操作)及其捕獲組功能嘗試以下操作:
sed -E 's/^[^:]*:([^[:space:]] )[[:space:]] -[[:space:]] \[([^]]*)\]/\1 \2/' Input_file
第三種解決方案:使用任何awk你可以使用以下代碼。在第一個和最后一個欄位上使用它的subandgsub
awk '{sub(/.*:/,"",$1);gsub(/^\[|\]$/,"",$NF);print $1,$NF}' Input_file
第四種解決方案:使用 Perl 的使用惰性匹配的單線解決方案,.*?可以嘗試使用其替換操作進行跟蹤。
perl -pe 's/^.*?:([^[:space:]] )[[:space:]] -[[:space:]] \[([^]]*)\]/\1 \2/' Input_file
uj5u.com熱心網友回復:
如果字串中有多個這些模式并且與順序無關,則可以使用awk,匹配您感興趣的模式,然后洗掉周圍的定界符。
在這種情況下,您可以匹配
\[[^][] ]|:[0-9]
模式匹配:
\[[^][] ]匹配自[...]|或者:[0-9]匹配:和 1 位數
gsub 中的部分[:\[]|\]$匹配: [ 字串的開頭,或者匹配]字串的結尾,并將其替換為空字串。
awk '
{
while(match($0,/\[[^][] ]|:[0-9] /)){
v = substr($0,RSTART,RLENGTH)
gsub(/^[:\[]|\]$/, "", v)
print v
$0=substr($0,RSTART RLENGTH)
}
}
' file
輸出
100
10/09/21:12:23:22
uj5u.com熱心網友回復:
假設輸入資料中沒有空行:
echo '10:100 - [10/09/21:12:23:22]' |
nawk 'sub("^[^:]*:",_, $!--NF)' FS='[ -]*[][]' OFS=', ' or gawk 'NF -= sub("^[^:]*:",_)' FS='[ -]*[][]' OFS=', ' or mawk 'NF -= sub("^[^:]*:",_)' FS='[][ -] ' OFS=', '
100, 10/09/21:12:23:22
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/512515.html
標籤:linuxUnixawk
