IT story

패턴 앞에 줄 바꿈을 삽입하는 방법은 무엇입니까?

hot-time 2020. 7. 11. 09:35
반응형

패턴 앞에 줄 바꿈을 삽입하는 방법은 무엇입니까?


줄 앞에 줄 바꿈을 삽입하는 방법이 아닙니다. 이것은 라인 내의 패턴 앞에 개행을 삽입하는 방법을 묻습니다.

예를 들어

sed 's/regexp/&\n/g'

정규 표현식 패턴 뒤에 줄 바꿈을 삽입합니다.

패턴 앞에서 똑같이 어떻게 할 수 있습니까?

다음은 입력 파일 예입니다

somevariable (012)345-6789

되어야한다

somevariable
(012)345-6789

이것은 bashLinux 및 OS X에서 테스트되어 작동합니다 .

sed 's/regexp/\'$'\n/g'

일반적으로 $작은 따옴표로 묶인 문자열 리터럴 bash은 C 스타일 백 슬래시 대체를 수행합니다 (예 : $'\t'리터럴 탭으로 변환). 또한 sed는 개행 문자를 백 슬래시로 이스케이프 처리하기를 원하므로 \이전 $. 마지막으로 달러 기호 자체는 셸에서 해석되도록 따옴표로 묶지 않아야하므로 따옴표 앞에 따옴표 $를 닫았다가 다시여십시오.

편집 : @ mklement0의 의견에서 제안했듯이 다음과 같이 작동합니다.

sed $'s/regexp/\\\n/g'

여기서 일어나는 일은 : 전체 sed 명령은 이제 C 스타일 문자열입니다. 이는 새 줄 리터럴이 다른 백 슬래시로 이스케이프되기 전에 sed가 배치되어야하는 백 슬래시를 의미합니다. 더 읽기 쉽지만이 경우 셸 문자열 대체를 수행 할 수 없습니다 (다시 작성하지 않아도 됨).


다른 답변 중 일부가 내 버전의 sed에서 작동하지 않았습니다. 의 위치를 전환 &하고하는 \n일을했다.

sed 's/regexp/\n&/g' 

편집 : 설치하지 않으면 OS X에서 작동하지 않는 것 같습니다 gnu-sed.


sed에서는 출력 스트림에 개행을 쉽게 추가 할 수 없습니다. 어색한 연속 줄을 사용해야하지만 다음과 같이 작동합니다.

$ sed 's/regexp/\
&/'

예:

$ echo foo | sed 's/.*/\
&/'

foo

자세한 내용은 여기참조 하십시오 . 조금 덜 어색한 것을 원한다면 perl -pesed 대신 match 그룹을 사용해보십시오 .

$ echo foo | perl -pe 's/(.*)/\n$1/'

foo

$1 그룹이 괄호 안에있는 정규식에서 첫 번째 일치 그룹을 나타냅니다.


내 Mac에서 다음은 줄 바꿈 대신 단일 'n'을 삽입합니다.

sed 's/regexp/\n&/g'

이것은 개행으로 대체됩니다.

sed "s/regexp/\\`echo -e '\n\r'`/g"

echo one,two,three | sed 's/,/\
/g'

이 경우에는 sed를 사용하지 않습니다. 나는 tr을 사용한다.

cat Somefile |tr ',' '\012' 

쉼표를 사용하여 캐리지 리턴으로 바꿉니다.


완전한 펄 정규 표현식 지원 (sed로 얻는 것보다 훨씬 강력 함) 의 장점으로 sed와 마찬가지로 perl one-liner를 사용할 수 있습니다 . * nix 플랫폼 간에는 변형이 거의 없습니다. perl은 일반적으로 perl입니다. 따라서 특정 시스템의 sed 버전을 원하는 방식으로 수행하는 방법에 대해 걱정하지 않아도됩니다.

이 경우에는 할 수 있습니다

perl -pe 's/(regex)/\n$1/'

-pe sed의 정상 작동 모드와 매우 유사하게 펄을 "실행 및 인쇄"루프에 넣습니다.

' 쉘이 방해하지 않도록 다른 모든 것을 인용

()정규 표현식을 둘러싼 그룹화 연산자입니다. $1대치의 오른쪽에이 parens에 일치하는 것이 인쇄됩니다.

마지막으로 \n줄 바꿈입니다.

괄호를 그룹화 연산자로 사용하는지 여부에 관계없이 일치시키려는 괄호를 피해야합니다. 따라서 위에 나열된 패턴과 일치하는 정규식은 다음과 같습니다.

\(\d\d\d\)\d\d\d-\d\d\d\d

\(또는 \)리터럴 패런과 \d일치하고 숫자 일치합니다.

보다 나은:

\(\d{3}\)\d{3}-\d{4}

나는 중괄호 안의 숫자가 무엇을하는지 알아낼 수 있다고 생각합니다.

Additionally, you can use delimiters other than / for your regex. So if you need to match / you won't need to escape it. Either of the below is equivalent to the regex at the beginning of my answer. In theory you can substitute any character for the standard /'s.

perl -pe 's#(regex)#\n$1#'
perl -pe 's{(regex)}{\n$1}'

Bonus tip - if you have the pcre package installed, it comes with pcregrep, which uses full perl-compatible regexes.


Hmm, just escaped newlines seem to work in more recent versions of sed (I have GNU sed 4.2.1),

dev:~/pg/services/places> echo 'foobar' | sed -r 's/(bar)/\n\1/;'
foo
bar

To insert a newline to output stream on Linux, I used:

sed -i "s/def/abc\\\ndef/" file1

Where file1 was:

def

Before the sed in-place replacement, and:

abc
def

After the sed in-place replacement. Please note the use of \\\n. If the patterns have a " inside it, escape using \".


echo pattern | sed -E -e $'s/^(pattern)/\\\n\\1/'

worked fine on El Captitan with () support


You can also do this with awk, using -v to provide the pattern:

awk -v patt="pattern" '$0 ~ patt {gsub(patt, "\n"patt)}1' file

This checks if a line contains a given pattern. If so, it appends a new line to the beginning of it.

See a basic example:

$ cat file
hello
this is some pattern and we are going ahead
bye!
$ awk -v patt="pattern" '$0 ~ patt {gsub(patt, "\n"patt)}1' file
hello
this is some 
pattern and we are going ahead
bye!

Note it will affect to all patterns in a line:

$ cat file
this pattern is some pattern and we are going ahead
$ awk -v patt="pattern" '$0 ~ patt {gsub(patt, "\n"patt)}1' d
this 
pattern is some 
pattern and we are going ahead

in sed you can reference groups in your pattern with "\1", "\2", .... so if the pattern you're looking for is "PATTERN", and you want to insert "BEFORE" in front of it, you can use, sans escaping

sed 's/(PATTERN)/BEFORE\1/g'

i.e.

  sed 's/\(PATTERN\)/BEFORE\1/g'

sed -e 's/regexp/\0\n/g'

\0 is the null, so your expression is replaced with null (nothing) and then...
\n is the new line

On some flavors of Unix doesn't work, but I think it's the solution at your problem.

echo "Hello" | sed -e 's/Hello/\0\ntmow/g'
Hello
tmow

After reading all the answers to this question, it still took me many attempts to get the correct syntax to the following example script:

#!/bin/bash
# script: add_domain
# using fixed values instead of command line parameters $1, $2
# to show typical variable values in this example
ipaddr="127.0.0.1"
domain="example.com"
# no need to escape $ipaddr and $domain values if we use separate quotes.
sudo sed -i '$a \\n'"$ipaddr www.$domain $domain" /etc/hosts

The script appends a newline \n followed by another line of text to the end of a file using a single sed command.


In vi on Red Hat, I was able to insert carriage returns using just the \r character. I believe this internally executes 'ex' instead of 'sed', but it's similar, and vi can be another way to do bulk edits such as code patches. For example. I am surrounding a search term with an if statement that insists on carriage returns after the braces:

:.,$s/\(my_function(.*)\)/if(!skip_option){\r\t\1\r\t}/

Note that I also had it insert some tabs to make things align better.


This works in MAC for me

sed -i.bak -e 's/regex/xregex/g' input.txt sed -i.bak -e 's/qregex/\'$'\nregex/g' input.txt

Dono whether its perfect one...

참고URL : https://stackoverflow.com/questions/723157/how-to-insert-a-newline-in-front-of-a-pattern

반응형