2012-04-24 2 views
1

Пусть A, B, C, D словаРегулярное выражение для замены одного слова другим на одной и той же линии Unix

входного файла:

.. 
A/B/C/D 
W/B/C/Z 
L/B/C/O 
.. 

Выходной файл:

.. 
A/B/C/A 
W/B/C/W 
L/B/C/L 
.. 

Замените word D на word A одной и той же линией, только если /B/C/ разделитель присутствует в строке и как мудрый для других линий

Любой sed/awk/perl oneliner для этого

ответ

2

Вы можете сделать:

sed -re 's/^([^/]*)(\/B\/C\/)([^/]*)$/\1\2\1/' file 

Демо:

$ cat file 
A/B/C/D 
W/B/C/Z 
L/B/C/O 

$ sed -re 's/^([^/]*)(\/B\/C\/)([^/]*)$/\1\2\1/' file 
A/B/C/A 
W/B/C/W 
L/B/C/L 
+0

Спасибо за ответ! но извините, мой вопрос вводит вас в заблуждение! смогите u пожалуйста проверите вопрос снова !! – user1228191

+0

@ user1228191: Я изменил ответ. – codaddict

+0

Perfect !! Еще раз спасибо :) – user1228191

1

Это должно сделать трюк. Perl -p -e 's/Ц/А/г'

В Сед Сед -e 's/Ц/А /'

+2

** Perl -p -e «s #^(\ W +) (/ B/C /) \ W + \ S * $ # \ 1 \ 2 \ 1 # '** – tuxuday

2
pearl.306> echo "A/B/C/D"|awk '{split($0,a,"/");print a[1]"/"a[2]"/"a[3]"/"a[1]}' 
A/B/C/A 
pearl.307> 

другой путь:

pearl.309> echo "A/B/C/D" | awk -F"/" '{OFS="/"}{$NF=$1;print}' 
A/B/C/A 
pearl.310> 

pearl.318> cat file1 
A/B/C/D 
W/B/C/Z 
L/B/C/O 
pearl.319> awk -F"/" '{OFS="/"}{$NF=$1;print}' file1 
A/B/C/A 
W/B/C/W 
L/B/C/L 
pearl.320> 
+0

Можем ли мы выполнить это действие в общем файле с разделителем! можете ли вы, пожалуйста, снова проверить мой вопрос – user1228191

+0

Да, конечно .. Мое редактирование – Vijay

3

Это awk решение:

awk -F/ -v OFS=/ '$2=="B" && $3=="C" {$4=$1}1' input.txt 
2

Это может работать для вас:

sed 's|^\(\(.\)/B/C/\).|\1\2|' file 

если A/B/C/D реальные слова, например, wordA/wordB/wordC/wordD, то:

sed 's/|^\(\([^/]*\)/wordB/wordC/\).*|\1\2|' file  
0
perl -pe 's#(/B/C/)(.*)#$1$`#' file 

это должно работать +