ここにはfile.txtのようなファイルがあります。
bbb-ccc-cccc#
aasdf asdas asdasa fgdg
asdfa asfdas adfaq asfa
afdaf fafa fafd afafa
bbb-ccc-cccc#
#
次に終わる単語を取り、各行の最初の単語として追加したいと思います。
sed 's/bbb-ccc-cccc#/^/' < file.txt > newfile.txt
#記号の前の単語を事前に知らないので、私のポイントはで終わる単語を見つけて各行の先頭#
に入れることです。この file.txt には次のものが必要です。
bbb-ccc-cccc#
bbb-ccc-cccc# aasdf asdas asdasa fgdg
bbb-ccc-cccc# asdfa asfdas adfaq asfa
bbb-ccc-cccc# afdaf fafa fafd afafa
bbb-ccc-cccc#
答え1
そしてperl
:
perl -lpe 'if (/\H+#/) {$word = $&} else {$_ = $word . $_}'
つまり、1行で空白以外の文字(\H+
)の後にaが続く場合は、そのシーケンス(正規表現に一致するもの)を次の行の先頭に挿入する単語として使用します。#
$&
awk
同じ
awk '
match($0, /[^[:blank:]]+#/) {
word = substr($0, RSTART, RLENGTH)
print
next
}
{print word $0}'
sed
(使用してスペアスペース保存する言葉):
sed '
/[^[:blank:]]\{1,\}#/ {
h; # save the line in the hold space
s//\
&\
/; # put newlines on each side of the matched word
s/.*\n\(.*\)\n/\1/; # remove every thing but the word
x; # swap hold and pattern space so that now the hold
# space contains the word. And branch off:
b
}
# for the other lines:
G; # append the hold space to the pattern space
s/\(.*\)\n\(.*\)/\2\1/; # move the word to the beginning'
word#
行の終わりにのみsを一致させるには、上記の3つのコマンドをすべてwithに置き換えます#
。#$
答え2
使用awk
:
$ awk '/^[^ ]*#$/ { prefix = $0; print; next } { print prefix, $0 }' file
bbb-ccc-cccc#
bbb-ccc-cccc# aasdf asdas asdasa fgdg
bbb-ccc-cccc# asdfa asfdas adfaq asfa
bbb-ccc-cccc# afdaf fafa fafd afafa
bbb-ccc-cccc#
これにより、プレフィックスを含むすべての行が印刷されます。プレフィックスは、パターンに一致するすべての行^[^␣]*#$
、つまり空白以外の文字でのみ完全に整理され、で終わる行から取得されます#
。この行は接頭辞を付けずに印刷され、次の入力行で処理が続行されます。
答え3
これが私の解決策ですgnu sed
。
sed '/\(.*\)#/{h;:y;n;/\(.*\)#/b;G;s/\(.*\)\n\(.*\)/\2\1/;by}' test.txt
簡単な説明:
- h は、現在のバッファを「予約済みスペース」にコピーします。
- Gは現在のバッファに「予約済みスペース」を追加します(削除する必要があるキャリーリターンを追加します)。
- :xxxはラベルです。
- bxxxは後藤です。 "b"だけがスクリプトの終わりに達しました
- n 現在のバッファを印刷し、次の行を読み込みます。
私のbashソリューションは次のとおりです。
while IFS='' read -r x;do if [[ "$x" = *# ]] ; then if [ "$p" = "$x" ]; then p=''; else p="$x"; x=''; fi ; fi; printf '%s%s\n' "$p" "$x";done < test.txt
答え4
バッシュから:
#!/bin/bash
# grab one of the lines ending in #
prefix=$(egrep '#$' file | head -1)
cat file | while read line
do
# if the line ends in a #, just print it
if [[ $line =~ \#$ ]]
then
echo $line
else
# print the line prefixed with the $prefix
printf -- "%s %s\n" "$prefix" "$line"
fi
done
[[ $line =~ \#$ ]]
は正規表現のif文ですegrep
。シェルが気に入らない場合に置き換えることができますif egrep -q '#$' <<< line; then
。