Попробуйте что-то вроде этого:
tr ',' '\n' < file.txt | grep -v \!
Предположение, что Вы действительно имели в виду...
test
column
no
column
... вот awk
решение:
awk -v RS=, '{ for (i=1; i<=NF; i++) if($i !~ /!/) print $i; }'
требует GNU grep:
grep -oP '(?<=^|,)[^!]+(?=,|$)'
на основе Вашего входа, который сообщает:
test
column
no
column
Если Вы не хотите, чтобы "столбец" появился дважды: grep -oP '(?<=^|,)[^!]+(?=,|$)' | sort -u
Perl сделан для подобных задач. Как насчет этого жемчуга (v5.10 и выше) один лайнер:
perl -aF, -nE 'for (@F) { say $_ unless m/!/ }'
Если у Вас есть более старый жемчуг, просто сделайте это: s/-E/-e/, s/say/print/
принятие Вашего текстового файла test.txt
, следующее:
for word in $(cat test.txt | sed -e 's/,/ /g'); do if [ ! "$( echo "$word" | grep '\!' )" == "$word" ]; then echo "$word"; fi; done
дает мне:
test
column
no
column
cat
и echo
, можно просто использовать herestrings/heredocs.)
– Chris Down
27.03.2012, 17:58
также в чистом sed существует решение
sed 's/\([,]\)*[^,]*![^,]*[,]*/\1/g;s/,$//;s/,/\n/g' file.txt