Я не то, что сведущий в sed
. Но это может быть сделано легко в perl
использование regex lookaround:
perl -pe 's/\\(?!N\b)/#/g' your_file_here
Это распечатает измененный файл к stdout. Для создания замен на месте можно сделать:
perl -pi -e 's/\\(?!N\b)/#/g' your_file_here
В основном это заменяет любой обратной косой чертой, не сопровождаемой N\b
(символ N на границе слова) с #
.
Править
Если Вы абсолютно уверены, что Ваши записи разграничены запятой, можно сделать это для покрытия случая когда \N
в конце слова (как в SOLEM\N
в примере Вы предоставили):
perl -pe ' s/\\/#/g; s/(\A|,)\s*#N\s*(\Z|,)/$1\\N$2/g;' your_file_here
Это просто занимает место, любая обратная косая черта со знаком "диез" затем ищет #N
найденный между двумя запятыми, между началом строки и запятой или между запятой и концом строки.
> awk -v OFS="'^'" -F"'\\\\^'" '{if(length($2)>20) $2=substr($2,1,20); print;}' file
'XYZ843141'^'ASDFSAFXYVFSHGDSDg s'^'BAAAR'^'YYY'^'..... and so on, further columns
'YYZ814384'^'ASfdEtRiuognfnseaFRE'^'foooobaaar'^'ZZZ'^'..... and so on, further columns
. Можно попробовать так:
paste -d^ <(cut -f1 -d^ in.csv) \
<(cut -f2 -d^ in.csv | sed -e 's/^\(.\{21\}\).*/\1'\''/')\
<(cut -f3- -d^ in.csv)
Однако это не удастся, если в некоторых полях есть ^
.
Вот простой пример sed, чтобы получить только 20 символов из нашей строки:
$ str = "ASDFSAFXYVFSHGDSDg sdGDS dsGDSgfa assfd faSDFAS saDFSAFD adFSA343fa sdfSADF"
$ echo $str | sed -e 's/^\(.\{20\}\).*/\1/'
ASDFSAFXYVFSHGDSDg s
Или с помощью команды cut:
$ echo $str | cut -c 1-20
EDIT: Как насчет этого :
$ echo $str | awk -F "^" '{print $1,$2}'
'XYZ843141' 'ASDFSAFXYVFSHGDSDg s'