
-로 시작하는 행과 일치하는 행 뒤에 sed를 추가하고 싶습니다. 다음과 같은 복잡한 행입니다.number_of_cars_are
more /tmp/orig_file
number_of_cars_are=$number_of_cars_are
추가하려는 줄은 다음과 같습니다.
numbers=` su hdfs -c "hdfs dfs -ls $var/*.jar" |sed s'/\// /g' | awk '{print $NF}' | wc -m `
그래서 우리는 다음을 수행했습니다.
sed '/^[[:space:]]*number_of_cars_are =.*/a numbers=` su hdfs -c "hdfs dfs -ls $var/*.jar" |sed s'/\// /g' | awk '{print $NF}' | wc -m `' /tmp/orig_file > /tmp/new_file
그러나 우리는 다음과 같은 결과를 얻습니다
sed: can't read /g | awk {print: No such file or directory
sed: can't read } | wc -m `: No such file or directory
그래서 우리는 백슬래시도 추가해 보았습니다.
sed '/^[[:space:]]*number_of_cars_are =.*/a numbers=` su hdfs -c \"hdfs dfs -ls $var/*.jar\" |sed s'/\// /g' | awk '{print \$NF}' | wc -m `' /tmp/orig_file > /tmp/new_file
하지만 똑같이
sed: can't read /g | awk {print: No such file or directory
sed: can't read $NF} | wc -m `: No such file or directory
줄을 추가하는 방법에 대한 제안 사항
답변1
쉘이 추가 행의 (원하는) 특수 기호를 해석하지 않도록 Sed 명령을 파일에 배치하는 것이 가장 좋습니다.
longline.sed
:
/^[[:space:]]*number_of_cars_are=/a\
numbers=` su hdfs -c "hdfs dfs -ls $var/*.jar" |sed s'/\\// /g' | awk '{print $NF}' | wc -m `
Sed는 이스케이프 문자를 해석하므로 유일한 수정 사항은 백슬래시를 이스케이프 처리하는 것입니다.
$ sed -f longline.sed newfile
more /tmp/orig_file
number_of_cars_are=$number_of_cars_are
numbers=` su hdfs -c "hdfs dfs -ls $var/*.jar" |sed s'/\// /g' | awk '{print $NF}' | wc -m `
답변2
heredoc
<<
이 시나리오에서는 이 기능을 최대한 활용할 수 있습니다 .
repl=$(cat - <<\eof |\
sed -e 's:[\&/]:\\&:g'
numbers=` su hdfs -c "hdfs dfs -ls $var/*.jar" |sed s'/\// /g' | awk '{print $NF}' | wc -m `
eof
)
$ sed \
-e '/^[[:blank:]]*number_of_cars_are=/G' \
-e "s/\\n/&$repl/" \
/tmp/orig_file
첫 번째 단계로 Heredoc을 사용하여 추가할 줄을 인쇄하고 이를 처리하여 RHS s/// 문자를 이스케이프 처리하고 이를 repl 변수에 저장합니다.
그런 다음 선택한 행의 s///rhs 부분에 삽입합니다.
이 방법은 매우 Posixly이며 파일이 필요하지 않습니다. 단선형 repl을 가정합니다.
답변3
주요 문제는 작은따옴표로 묶인 문자열에 작은따옴표를 포함할 수 없다는 것입니다. 명령줄에 삽입된 줄을 제공하려면 작은따옴표 문자열을 끊고 따옴표로 묶인 작은따옴표를 추가한 다음 문자열을 계속해야 합니다. 따라서 각 작은따옴표는 또는 '\''
로 작성됩니다 '"'"'
. 여기서 옆에 있는 두 개의 작은따옴표는 각각 작은따옴표 앞과 뒤에 작은따옴표 문자열로 끝나고 시작됩니다.
추가적인 예방 조치를 취하지 않으려면 문서에 삽입할 줄을 텍스트로 제공할 수 있습니다.
~처럼콰지모도의 답변, 그러나 여기에 참조된 문서를 사용하면 명령줄에서 직접 가능합니다.
sed -f /dev/stdin file <<'END_SED'
/^number_of_cars_are/a\
numbers=` su hdfs -c "hdfs dfs -ls $var/*.jar" |sed s'/\// /g' | awk '{print $NF}' | wc -m `
END_SED
문서가 여기에 인용되어 있기 때문에( END_SED
초기 구분 기호 주위에 작은따옴표로 표시됨) 쉘은 그 안의 어떤 확장도 확장하지 않습니다.
이 sed
유틸리티는 이 문서를 사용하여 표준 입력에서 읽습니다 -f /dev/stdin
.