使用sed命令和readlink(或simmilar)将完整路径替换为文本

时间:2016-05-04 13:19:38

标签: bash sed

我正在编写一个BASH脚本,我想用Path= readlink -e /home/user/Videos/*.mp4 sed -i "s/original_text/$Path/g" /home/user/Documents/Text.txt 将文件的完整路径替换为文本。

我目前有这个:

void Main()
{
    var keyValuePairs = new List<KeyValuePair>
    {
        new KeyValuePair {Key = "Name", Value = "Test"},
        new KeyValuePair {Key = "Age", Value = "42"},
        new KeyValuePair {Key = "Country", Value = "USA"}
    };

    var list = new List<Filter>();
    list.Add(new Filter { Name = "Test", Age = "42", Country = "USA" });

    list.Where(keyValuePairs.ToPredicate<Filter>()).Dump();
}

public class Filter
{
    public string Name { get; set; }
    public string Age { get; set; }
    public string Country { get; set; }
}

public class KeyValuePair
{
    public string Key { get; set; }

    public string Value { get; set; }
}

public static class KeyValuePairExtensions
{
    public static Func<T, bool> ToPredicate<T>(this IEnumerable<KeyValuePair> keyValuePairs)
    {
        if (keyValuePairs == null || !keyValuePairs.Any())
            return t => false; // default value in case the enumerable is empty

        var parameter = Expression.Parameter(typeof(T));

        var equalExpressions = new List<BinaryExpression>();

        foreach (var keyValuePair in keyValuePairs)
        {
            var propertyInfo = typeof(T).GetProperty(keyValuePair.Key);

            var property = Expression.Property(parameter, propertyInfo);

            var value = Expression.Constant(keyValuePair.Value, propertyInfo.PropertyType);

            var equalExpression = Expression.Equal(property, value);
            equalExpressions.Add(equalExpression);
        }

        var expression = equalExpressions.First();

        if (equalExpressions.Count > 1)
        {
            // combine expression with and
            expression = Expression.AndAlso(equalExpressions[0], equalExpressions[1]);

            for (var i = 2; i < equalExpressions.Count; i++)
            {
                expression = Expression.AndAlso(expression, equalExpressions[i]);
            }
        }

        var lambda = (Func<T, bool>)Expression.Lambda(expression, parameter).Compile();
        return lambda;
    }
}

我的想法是将单个MP4视频的路径(该文件夹中没有其他视频)替换为文本文件,这样每次我想要替换它时都不必写出视频名称

我已经为这个问题尝试了不同的选项,但是我无法使其发挥作用。

提前致谢。

2 个答案:

答案 0 :(得分:1)

使用命令替换将命令的输出保存在变量中:

Path="$(readlink -e /home/user/Videos/*.mp4)"

在声明变量时,shell也不支持=周围的任何空格。

如果您有多个文件,最好使用数组:

Paths=( $(readlink -e /home/user/Videos/*.mp4) )

并按"${Paths[@]}"

访问数组元素

答案 1 :(得分:1)

我相信您的$Pathslash(/)的价值,例如/home/user/Videos/foo.mp4,这会让您sed失败。您可以对sed的s命令使用其他分隔符。

试试这个sed行:

sed -i "s@original_text@$Path@g" /home/user/Documents/Text.txt

您也应引用readlink命令,并在=

之后立即删除空格