[英]"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:]]+/#&#/'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.