複数のパイプを使用せずにsedを複数回呼び出すことができます。 cmdを次のように区切ります。 (すべてありがとう...)複数のcmd;
にこれを使用する方法はありますか?awk -F
sed
マルチパイプの使用
echo "'text';" | \
sed s"#';##"g | \
sed s"#'##"g
text
区切り記号sed
として使用;
echo "'text';" | \
sed " \
s#';##g; \
s#'##g \
"
text
編集する:
したがって、awk
.dllを使用して複数のcmdに参加できます;
。しかし、awk -F
複数のcmdではこれを行うことはできません。
問題は複数の awk -F
コマンドをリンクすることですが、まだ答えはありません。
背景
# '/x/ gives the href of the actual videos
# awk -F '/x/' '{print$2}’
# because the /x/ is unique to the video urls
# after this the video links appear
# but I have to get rid of stuff
# on the right of them so I do
# awk —F 'title' '{print$1}'
# this returns all the video links
# but they have a double quotes
# and a semi colon on the end.
curl -s \
https://site.com/plist/page={0..50} | \
grep '/x/' | \
awk -F '/x/' '{print$2}' | \
awk -F 'title' '{print$1}' | \
sed ' \
s#";##g; \
s#"##g \
'
これで、多くのビデオリンクがあり、ビデオダウンロードリンクを取得するために追加の処理を実行し、mapfile
ダウンロードリンクを配列にインポートしてparallel
ダウンロードするために使用します。
このコード例では、実際に実行される作業を大幅に短縮しました。
編集する:
だからこれはできません。このユーザーに深く感謝します。
このユーザーはsed
私の特定のケースではこれが必要ではないと言いましたが、awk -F
少なくとも20の異なるケースがあります。しかし、これは私に考える距離を与え、私がこのことをする理由は、awk -F
sed正規表現を全く知らなくても私に必要なものを提供するからです。
とにかくみんなありがとうございます。
ありがとう
@StèphaneChazelasに彼らの意見が私の問題を解決しました。
ベストアンサー1
修正する:問題は実質的な変化この回答を投稿した後も、元の回答はまだ正確ですが、問題を解決するのに大きな助けにはなりません。実際OPさんの質問です。
curl
フォームの出力を処理したいようです。
Ignore this
http://some.url.involving/x/'video-link-1';title...
http://some.url.involving/x/'video-link-2';title...
Ignore that
待って、どこに行きたいですか?
- 表示された行のみが処理されます
/x/
。 - 中間部分を抽出してみてください。
' ... '
最も簡単な方法は、1つのフィールド区切り文字のみを使用することです'
。
curl -s https://site.com/plist/page={0..50} | awk -F"'" '/\/x\//{print $2}'
また、/x/
対応するパターンを含む行のみが考慮されます。したがって、上記の例では、出力は次のようになります。
video-link-1
video-link-2
分割のフィールド区切り文字を変更してこれを行う場合もちろん、FS
内部変数を途中で変更できます。Stephen Chazerasの答え。ただし、この場合は、-F
オプションパラメータで設定してもプログラムFS
内部割り当てで設定しても、複数文字フィールド区切り文字が完全正規表現awk
として処理されるという事実を使用したいと思います。
つまり、「or」型オーバーライドをフィールド区切り文字として使用して両方の場合を処理できます(ただし、追加の後処理を必要としないように単一引用符とセミコロンも含める必要があります)。
curl -s https://site.com/plist/page={0..50} |
awk -F'/x/\047|\047;title' '/\/x\//{print $2}'
- これにより、フィールド区切り文字が次のように設定されます。誰でも
/x/'
または';title
。 - このパターンを含む行のみを考慮してください
/x/
。この行には、必要な情報である2番目のフィールドが印刷され(削除されます'
);
。 - 一重引用符は、「一重引用符内の一重引用符」の問題を回避するためにASCIIコードで示されています。
\047
(私はあなたのOSがASCIIベースのシステムであると仮定しています。EBCDIC)。
頻繁に遭遇する別の方法「全行を面白い部分にだけ入れ替える」です。
curl -s https://site.com/plist/page={0..50} |
awk '/\/x\//{print gensub(/.*\/x\/\047([^\047]+).*/,"\\1","1")}'
その後、/x/
パターンが発生した行だけを考慮して、行全体をパターンの後ろの一重引用符の間の内容に置き換え、修正された行を印刷してその部分のみを抽出します。
単一sed
の呼び出しで同じ効果を得ることができますが、ASCIIコードで一重引用符を表現することはここでは機能しないため、もう少し複雑です。 GNUにEREオプションがsed
あると仮定すると:-E
curl -s https://site.com/plist/page={0..50} | sed -n -E 's|.*\/x\/'\''([^'\'']+).*|\1|p'
これは基本的に出力を抑制し-n
、ケースと同じ交換を行いawk
(後続p
)を印刷します。交換時のみ、これはパターンが見つかったことを意味します。/x/'video-link';title
元の答えは次のとおりです
フレームワーク課題:それは必要ですか?
では、awk
同じプログラムの修正コマンドを必要なだけ繰り返すことができます。
echo "'text';" | awk '{gsub(/\047;/,""); gsub(/\047/,"")} 1'
または
echo "'text';" | awk '{gsub(/\047;/,"")} {gsub(/\047/,"")} 1'
(\047
一重引用符プログラムで一重引用符を表すために使用されます。)
次のように読みやすい方法で作成することもできます。
echo "'text';" |
awk '{gsub(/\047;/,"")};
{gsub(/\047/,"")}; 1'
または専用プログラムとして:
echo "'text';" | awk -f multi-substitute.awk
multi-substitute.awk
のように見える
#!/usr/bin/awk -f
{gsub(/\047;/,"")}
{gsub(/\047/,"")}
1