我想做的是在標題中。
輸入:
apple -berry --sun house-roof computer-- orange number-43
期望的輸出:
apple house-roof computer-- orange number-43
換句話說,只有當一個單詞以-or開頭時,--它才應該被洗掉。我得到的最接近的是:
echo "apple -berry --sun house-roof computer-- orange number-43" | sed -r 's/(-|--)\w //g'
apple house computer-- orange number
這與我想要的相差甚遠。可以用其他工具解決嗎?切?
uj5u.com熱心網友回復:
您可以使用
sed -E 's/(^|[[:space:]] )-{1,2}[^[:space:]] //g'
詳情:
-E啟用 POSIX ERE 正則運算式語法(^|[[:space:]] )-{1,2}[^[:space:]]- 火柴(^|[[:space:]] )- 字串開頭或一個或多個空格-{1,2}- 一個或兩個連字符[^[:space:]]- 一個或多個非空白字符。
查看在線演示:
#!/bin/bash
s='apple -berry --sun house-roof computer-- orange number-43'
sed -E 's/(^|[[:space:]] )-{1,2}[^[:space:]] //g' <<< "$s"
輸出:
apple house-roof computer-- orange number-43
uj5u.com熱心網友回復:
您也可以通過將每個標記轉換為一行然后grep使用否定模式來實作。
例如:
xargs -n1 <input.txt | grep -v -E -e '^-[-]?[[:alnum:]]' | xargs
uj5u.com熱心網友回復:
使用sed
$ sed s'/^-[^ ]*\| --\?[^ ]*//g' input_file
apple house-roof computer-- orange number-43
uj5u.com熱心網友回復:
普通的 bash:
input="apple -berry --sun house-roof computer-- orange number-43"
read -ra words <<< "$input"
ok_words=()
for word in "${words[@]}"; do
[[ $word == @(-|--)* ]] || ok_words =("$word")
done
echo "${ok_words[*]}"
apple house-roof computer-- orange number-43
@(-|--)是擴展模式匹配或者 - --
uj5u.com熱心網友回復:
使用您顯示的示例,請嘗試以下awk代碼。簡單的解釋是,檢查每行的每個欄位值并檢查條件是否欄位不是從任何一個開始-或--然后將其值添加到變數line最后列印行的值(變數,在回圈開始awk之前被無效)。for
awk '
{
line=""
for(i=1;i<=NF;i ){
if($i!~/^-[^-]/ && $i!~/^--[^-]/){
line=(line?line OFS:"") $i
}
}
print line
}
' Input_file
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/475838.html
上一篇:使用檔案的多行反轉grep匹配
