Как я могу поменять две строки, используя sed? - PullRequest
3 голосов
/ 22 октября 2010

Кто-нибудь знает, как заменить line a на line b и line b на line a в текстовом файле с помощью редактора sed?

Я вижу, как заменить строку в шаблонепробел с линией, которая находится в удерживающем пространстве (то есть, /^Paco/x или /^Paco/g), но что, если я хочу взять строку, начинающуюся с Paco, и заменить ее строкой, начинающейся с Vinh, а такжевозьмите строку, начинающуюся с Vinh, и замените ее строкой, начинающейся с Paco?

. Для начала предположим, что есть одна строка с Paco и одна строка с Vinh, и чтострока Paco находится перед строкой Vinh.Тогда мы можем перейти к общему случаю.

Ответы [ 4 ]

3 голосов
/ 22 октября 2010
#!/bin/sed -f
/^Paco/ {
:notdone
  N
  s/^\(Paco[^\n]*\)\(\n\([^\n]*\n\)*\)\(Vinh[^\n]*\)$/\4\2\1/
  t
  bnotdone
}

После сопоставления / ^ Paco / мы читаем в буфер шаблонов до тех пор, пока s // не выполнится успешно (или EOF: буфер шаблонов будет напечатан без изменений).Затем мы начнем поиск /^Paco/.

2 голосов
/ 31 июля 2012
cat input | tr '\n' 'ç' | sed 's/\(ç__firstline__\)\(ç__secondline__\)/\2\1/g' | tr 'ç' '\n' > output

Замените __firstline__ и __secondline__ желаемыми регулярными выражениями. Обязательно замените все экземпляры . в вашем регулярном выражении на [^ç]. Если ваш текст содержит ç, замените его чем-то еще, чего нет в вашем тексте.

0 голосов
/ 22 октября 2010

попробуйте этот скрипт awk.

s1="$1"
s2="$2"
awk -vs1="$s1" -vs2="$s2" '
{ a[++d]=$0 }
$0~s1{ h=$0;ind=d}
$0~s2{
 a[ind]=$0
 for(i=1;i<d;i++ ){ print a[i]}
 print h
 delete a;d=0;
}
END{ for(i=1;i<=d;i++ ){ print a[i] } }' file

output

$ cat file
1
2
3
4
5

$ bash test.sh 2 3
1
3
2
4
5

$ bash test.sh 1 4
4
2
3
1
5

Используйте sed (или не используйте его вообще) только для простой замены.Что-нибудь более сложное, используйте язык программирования

0 голосов
/ 22 октября 2010

Простой пример из документа GNU sed texinfo:

Note that on implementations other than GNU `sed' this script might
easily overflow internal buffers.

 #!/usr/bin/sed -nf

 # reverse all lines of input, i.e. first line became last, ...

 # from the second line, the buffer (which contains all previous lines)
 # is *appended* to current line, so, the order will be reversed
 1! G

 # on the last line we're done -- print everything
 $ p

 # store everything on the buffer again
 h
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...