如何在Linux中删除分隔符之前的文本


16

我需要从定界符之前的一行中删除文本。

例如:

(123434): hello::{apple,orange,mango}.

我需要先删除文本:。即(123434)

linux中是否有任何命令可以执行此任务?


你可能要考虑sed或者awk
保罗

此文本是文件的一部分,还是bash变量的一部分?
2014年

它是文件的一部分。
user80538 2014年

Answers:


14

sed命令应该可以解决问题。以下命令将覆盖文件:

sed -i 's/^[^:]*:/:/' file

要仅打印输出,请删除该-i标志。要将输出放入新文件中,请删除该-i标志并重定向输出:

sed 's/^[^:]*:/:/' file > new_file

该生产线做了魔法......输出的文件本身替换..
user80538

当我使用sdiff比较两个文件时,从两个文件中删除文本后,差异为我显示了删除的文本。此命令将覆盖文件或仅显示输出。
user80538 2014年

它起作用了。通过在上述命令中进行简单的更改,我可以从示例中提取“ hello”和{apple,orange,mango}吗?
user80538 2014年

@ user80538,在这种情况下说提取时很难说出您想要什么。这是更大的Shell脚本的一部分吗?您可能想问一个新问题,其中包含您要解决的较大问题的详细信息。
drs 2014年

这只是对具有相同数据的两个文件的简单比较,但只需要查找两个文件中数据不同的地方。我需要检查该行中的每个单独部分。各个部分中的数据可能会混乱。像{apple,orange,mango}可以是{apple,mango,orange}。
user80538 2014年


5

您可以使用非常简单的Bash指令执行此操作:

mytext="(123434): hello::{apple,orange,mango}."

echo ${mytext#*)}

这将打印: hello::{apple,orange,mango}.。您可以用类似的方式剪切前缀和后缀。此外,前缀和后缀定义可以包含通配符。

剪切前缀-最多第一个前缀通配符匹配: ${variable#prefix}

剪切前缀-直到最后一个前缀通配符匹配: ${variable##prefix}

切掉后缀-直到第一个后缀通配符匹配: ${variable%suffix}

切掉后缀-直到最后一个后缀通配符匹配: ${variable%%suffix}

乍一看可能不清楚,请参见以下示例:

mytext="xAxBxAxBx"
echo ${mytext#*A}    # will print: xBxAxBx
echo ${mytext##*A}   # will print: xBx
echo ${mytext%B*}    # will print: xAxBxAx
echo ${mytext%%B*}   # will print: xAx
echo ${mytext%%C*}   # will print: xAxBxAxBx

在最后一个示例中,模式不匹配,因此不会剪切任何内容。


使用起来会更健壮echo ${mytext#*:}:。这样可以正确处理像(123)(434): hello::{apple,orange,mango}.和这样的线123434: hello::{apple,orange,mango}
drs

在您的示例中,有什么方法可以修改命令echo $ {mytext %% B *}以在B之后获取文本
user80538 2014年

@ user80538是的,只是削减B,包容;-),即前文:第一个B之后文本$ {mytext的#* B}和$ {mytext的## * B}第二B.后文
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.