패턴 앞에 줄 바꿈을 삽입하는 방법은 무엇입니까?
줄 앞에 줄 바꿈을 삽입하는 방법이 아닙니다. 이것은 라인 내의 패턴 앞에 개행을 삽입하는 방법을 묻습니다.
예를 들어
sed 's/regexp/&\n/g'
정규 표현식 패턴 뒤에 줄 바꿈을 삽입합니다.
패턴 앞에서 똑같이 어떻게 할 수 있습니까?
다음은 입력 파일 예입니다
somevariable (012)345-6789
되어야한다
somevariable
(012)345-6789
이것은 bash
Linux 및 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 -pe
sed 대신 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
'IT story' 카테고리의 다른 글
ASP.NET MVC 조건부 유효성 검사 (0) | 2020.07.11 |
---|---|
std :: unique_ptr 멤버와 함께 사용자 정의 삭제기를 사용하려면 어떻게합니까? (0) | 2020.07.11 |
Flask 앱에 정의 된 모든 경로 목록 가져 오기 (0) | 2020.07.11 |
파이썬에서 지수 및 로그 곡선 피팅을 수행하는 방법은 무엇입니까? (0) | 2020.07.11 |
문자열의 정확한 일치를위한 정규식 (0) | 2020.07.11 |