簡體   English   中英

“sed”與模式不匹配

[英]"sed" doesn't match pattern

我正在嘗試格式化剪切、粘貼 output 但 sed 不起作用。

文件.txt

Apple
Banana
Apple
Banana
Orange
Apple
Orange

代碼.sh

cut -f2 file.txt | sort | uniq | sed 's/^\|$/#/g'| paste -sd,\& -

預期 output / output 在 ubuntu

#Apple#,#Banana#&#Orange#

在 macOS 上獲取 output / output

Apple,Banana&Orange

注意:該代碼在 Ubuntu 上有效,但在 MacOS 上無效。

這可以在單個gnu-awk中完成:

awk '!seen[$1]++{} END {
    PROCINFO["sorted_in"]="@ind_str_asc"
    for (i in seen)
      s = s (s == "" ? "" : (++j==1?",":"&")) "#" i "#"
    print s
}' file

#Apple#,#Banana#&#Orange#

在 OSX 上,我通過home brew安裝了gnu awk

據我所知,BSD/Mac sed不支持\| . 有關詳細信息,請參閱sed 沒有給我正確的換行符替換操作 - GNU sed 和 BSD / OSX sed 之間的差異

作為替代方案,您可以使用 ERE 代替 BRE。 我在 Linux 上檢查了它,顯然這在 Mac 上似乎仍然不起作用(另請參閱: MacOS sed:匹配開頭或結尾)。

$ echo 'Apple' | sed -E 's/^|$/#/g'
#Apple#

# workaround for Mac
$ echo 'Apple' | sed -e 's/^/#/' -e 's/$/#/'
#Apple#

除了sort+uniq+sed ,您還可以使用awk (但請注意,此處顯示的awk解決方案在保留原始順序的同時刪除了重復項,不對輸入sort ):

$ awk '!seen[$0]++{print "#" $0 "#"}' ip.txt
#Apple#
#Banana#
#Orange#

如果您只需要第二個字段,請根據您對cut的使用將$0更改為$2

如其他地方所述,BSD sed不支持\| . 除了替換^$ ,您可以在整行周圍替換#

sort -u file.txt | sed 's/.*/#&#/' | paste -sd,'&' -

使用 sed 命令的簡單方法:

sed -E 's/[[:alnum:]]+/#&#/'
  • -E選項用於啟用 POSIX ERE(擴展常規
    表達)
  • [[:alnum:]]+字母數字字符; 在 ASCII 中,相當於 [A-Za-z0-9] 加上加號(+)表示一個或多個。
  • &符號,確實帶來或引用了我們找到的模式的內容。 (我們用#包圍它)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM